线程同步实例
模拟电影院购票
import java.util.ArrayList;
import java.util.List;
/**
* 使用多线程模拟实现影院选位子
* @author dxt
*
*/
public class Cinema {
public static void main(String[] args){
//影院位子
List<Integer> seats = new ArrayList<Integer>();
seats.add(1);
seats.add(2);
seats.add(3);
seats.add(4);
seats.add(5);
seats.add(6);
//客户所需位子
List<Integer> c1 = new ArrayList<Integer>();
c1.add(1);
c1.add(2);
c1.add(3);
List<Integer> c2 = new ArrayList<Integer>();
c2.add(4);
c2.add(5);
c2.add(6);
Seat s = new Seat(seats, "AAA");
new Thread(new Customer(s, c1), "a").start();
new Thread(new Customer(s, c2), "b").start();
}
}
/**
* 模拟电影院卖位子
* @author dxt
*
*/
class Seat{
//可用位子数
List<Integer> seatNum;
//影院名称
String name;
public Seat(List<Integer> l, String name){
this.seatNum = l;
this.name = name;
}
public boolean sellSeat(List<Integer> seats){
System.out.println("可用位子数:" + this.seatNum);
List<Integer> copy = new ArrayList<Integer>();
copy.addAll(seatNum);
//相减,判断能否提供对应编号的位子
copy.removeAll(seats);
if(seatNum.size() - copy.size() != seats.size()){
return false;
}
//能提供,则剩余位子 = 减去之后的位子
this.seatNum = copy;
return true;
}
}
class Customer implements Runnable{
Seat seat; //哪家电影院
List<Integer> seats; //所需位子号码
public Customer(Seat s, List<Integer> l){
this.seat = s;
this.seats = l;
}
public void run(){
//为seat添加锁
synchronized(seat){
boolean flag = seat.sellSeat(seats);
if(flag){
System.out.println("出票成功" + Thread.currentThread().getName() + "-- 位子数:" + this.seats);
}else{
System.out.println("出票失败");
}
}
}
}
结果: