案例一:这个案例是一个电影院选座,比如ab两个人同时选两个座,a选两个座,b选一个座,电影院就剩两个座,比如a先进去的,把两座选走,那b就会报出票失败,票已售罄。
public class HappCinema {
public static void main(String[] args) {
Cinema c = new Cinema(2,"happy cb");
new Thread(new Customer(c,2),"张三").start();
new Thread(new Customer(c,1),"李四").start();
}
}
//顾客
class Customer implements Runnable{
Cinema cinema;
int seats;
public Customer(Cinema cinema, int seats) {
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{
int available;//可用的位置
String name; //名称
public Cinema(int available,String name) {
this.available = available;
this.name = name;
}
//购票
public boolean bookTickets(int seats){
System.out.println("可用位置为:"+available);
if(seats>available){
return false;
}
available -=seats;
return true;
}
}
接下来把这个案例改一下,改成能选择座位,比如电影剩下<1,2,3,4,6,7>位置,就必须在这里选,如果有的话的购票成功,否则就购票失败
public class HappCinema01 {
public static void main(String[] args) {
//可用位置
List<Integer> avIntegers = new ArrayList<Integer>();
avIntegers.add(1);
avIntegers.add(2);
avIntegers.add(3);
avIntegers.add(4);
avIntegers.add(6);
avIntegers.add(7);
//顾客需要的位置
List<Integer> seats1 = new ArrayList<Integer>();
seats1.add(1);
seats1.add(2);
//顾客需要的位置
List<Integer> seats2 = new ArrayList<Integer>();
seats2.add(4);
seats2.add(5);
seats2.add(6);
cbCinema c = new cbCinema(avIntegers,"happy cb");
new Thread(new HappyCustomer(c,seats1),"张三").start();
new Thread(new HappyCustomer(c,seats2),"李四").start();
}
}
//顾客
class HappyCustomer implements Runnable{
cbCinema cinema;
List<Integer> seats;
public HappyCustomer(cbCinema cinema, List<Integer> seats) {
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 cbCinema{
List<Integer> available;//可用的位置
String name; //名称
public cbCinema(List<Integer> available,String name) {
this.available = available;
this.name = name;
}
//购票
public boolean bookTickets(List<Integer> seats ){
System.out.println("欢迎光临"+this.name+"当前可用位置为:"+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;
}
}
案例三:把同步块改成同步方法
public class Happy12306 {
public static void main(String[] args) {
Web12306 c = new Web12306(4,"happy cb");
new Passenger(c, "张三", 2).start();
new Passenger(c, "李四", 2).start();
}
}
//顾客
class Passenger extends Thread{
int seats;
public Passenger(Runnable target,String name,int seats) {
super(target,name);
this.seats = seats;
}
}
//火车票
class Web12306 implements Runnable{
int available;//可用的位置
String name; //名称
public Web12306(int available,String name) {
this.available = available;
this.name = name;
}
//购票
public synchronized boolean bookTickets(int seats){
System.out.println("可用位置为:"+available);
if(seats>available){
return false;
}
available -=seats;
return true;
}
@Override
public void run() {
Passenger p =(Passenger)Thread.currentThread();
boolean flag = this.bookTickets(p.seats);
if(flag){
System.out.println("出票成功"+Thread.currentThread().getName()+"-->位置为:"+p.seats);
}else {
System.out.println("出票失败"+Thread.currentThread().getName()+"-->票已售罄");
}
}
}