多线程模拟电影院选位置

public class HappyCinema {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<Integer> available=new ArrayList<Integer>();
		available.add(3);
		available.add(2);
		available.add(5);
		available.add(1);
		available.add(6);
		available.add(7);
		available.add(10);
		
		//顾客的位置
		List<Integer> seats1=new ArrayList<Integer>();
		seats1.add(5);
		seats1.add(7);
		seats1.add(2);
		List<Integer> seats2=new ArrayList<Integer>();
		seats2.add(3);
		seats2.add(5);
		seats2.add(7);
		Cinema c=new Cinema(available,"wanjia");
		new Thread(new Customer(c,seats1),"lsy").start();
		new Thread(new Customer(c,seats2),"lcw").start();
	}

}

//有多个顾客,所以得创建多个线程。因此继承接口。
class Customer implements Runnable{
	Cinema cinema;
	List<Integer> seats;
	
	public Customer(Cinema cinema,List<Integer> seats) {
		super();
		this.cinema = cinema;
		this.seats = seats;
	}

	@Override
	public void run() {
		synchronized (cinema) {
			
		
		boolean flag=cinema.bookTickets(seats);
		if(flag) {
			System.out.println("出票成功"+Thread.currentThread().getName()+"-->位置为"+seats);
		}else {
			System.out.println("出票失败"+Thread.currentThread().getName()+"-->位置不够");

		}
		}
		
	}
	
}

class Cinema{
	List<Integer> available;//可用的位置
	String name;//名称
	public Cinema(List<Integer> available, String name) {
		super();
		this.available = available;
		this.name = name;
	}
	//购票
	public boolean bookTickets(List<Integer> seats) {
		System.out.println("可用位置:"+available);
		List<Integer> copy=new ArrayList<Integer>();//现将原来的容器进行保存。
		copy.addAll(available);
		
		//相减
		copy.removeAll(seats);
		
		//判断大小,总的座位数减去购买之后的总座位数是否等于购买座位的个数
		if(available.size()-copy.size()!=seats.size()) {
			//不相等则表示购票不成功了
			return false;
		}
		//成功
		available=copy;//将购买之后的座位返回;
		return true;
	}
}

发布了43 篇原创文章 · 获赞 11 · 访问量 2568

猜你喜欢

转载自blog.csdn.net/weixin_43328816/article/details/104415786
今日推荐