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

初级

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张票

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值