加深synchronized的理解,模拟火车选位置的方法

it2023-07-06  78

初级

package com.lzy.syn; public class dBookTrain { public static void main(String[] args) { Train t=new Train("k1046",20); //火车班次,以及火车总票数 new Thread(new Passenger(t,5),"小明").start(); //小明选了5张票班次k1046 new Thread(new Passenger(t,15),"小刚").start();//小红选了15张票班次k1046 } } //乘客 class Passenger implements Runnable{ Train train;//火车 int seats;//票数 public Passenger(Train train, int seats) { this.train = train; this.seats = seats; } @Override public void run() { synchronized(train) { boolean flag=train.choose(seats); if(flag) {//订票成功 System.out.println("欢迎乘坐"+train.name +"列车,"+Thread.currentThread().getName()+"定了"+seats+"张票"); } else {//订票失败 System.out.println("购票失败,请重试或选择其他列车"); } } } } //火车 class Train { String name;//火车班次 int available;//座位 public Train(String name, int available) { this.name = name; this.available = available; } public boolean choose(int seats) { if(seats>available) {//所选票数大于火车总票数,出票失败 return false; } //出票成功 available-=seats;//更新火车车票数 return true; } }

运行结果: 欢迎乘坐k1046列车,小明定了5张票 欢迎乘坐k1046列车,小刚定了15张票 在这只能显示乘客定了几张票,而不能清楚自己的位置在哪,下面代码稍微增进一下

增进代码(加入List)

package com.lzy.syn; import java.util.ArrayList; import java.util.List; public class dBookTrain02 { public static void main(String[] args) { List<Integer> t=new ArrayList<>(); for(int i=1;i<=10;i++) { t.add(i); }//添加火车空余位置 GoTrain g=new GoTrain("k1046",t); List<Integer> s=new ArrayList<>();//乘客lzy选的位置 s.add(3); s.add(5); List<Integer>h=new ArrayList<>();//乘客lll选的位置 h.add(1); h.add(9); h.add(8); h.add(6); new Thread(new GoPassenger(g,s),"lzy").start(); new Thread(new GoPassenger(g,h),"lll").start(); } } class GoPassenger implements Runnable{ GoTrain train; List<Integer> seats;//乘客所选位置 public GoPassenger(GoTrain train, List<Integer> seats) { this.train = train; this.seats = seats; } @Override public void run() { synchronized(train) { boolean flag=train.choose(seats);//判断是否购票成功 if(flag) { System.out.println("欢迎乘坐"+train.name +"列车,"+Thread.currentThread().getName() +"定了"+seats+"位置的票,"+"共"+seats.size()+"张票"); } else { System.out.println("购票失败,请重试或选择其他列车"); } } } } class GoTrain { String name;//那一班火车 List<Integer> available;//空余座位位置 public GoTrain(String name, List<Integer> available) { this.name = name; this.available = available; } public boolean choose(List<Integer> seats) { System.out.println("欢迎乘坐本班列车,本班列车可选位置有:"+available); List<Integer> copyavailable=new ArrayList<>(); copyavailable.addAll(available);//复制火车空余位置 copyavailable.removeAll(seats);//火车座位减去乘客选的位置 if(available.size()-copyavailable.size()!=seats.size()) { //判断火车空余位置总数-(copyavailable-减去乘客选的位置)是否等于乘客选的位置 return false; } //购买成功 available=copyavailable;//更新火车空余位置 return true; } }

运行结果 欢迎乘坐本班列车,本班列车可选位置有:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 欢迎乘坐k1046列车,lzy定了[3, 5]位置的票,共2张票 欢迎乘坐本班列车,本班列车可选位置有:[1, 2, 4, 6, 7, 8, 9, 10] 欢迎乘坐k1046列车,lll定了[1, 9, 8, 6]位置的票,共4张票

最新回复(0)