有一辆班车除司机外只能承载80个人,假设前中后三个车门都能上车(每次从一个门上车,且上车人数不能超过剩余座位数),如果坐满则不能再上车。
请用线程模拟上车过程并且在控制台打印出是从哪个车门上车以及剩下的座位数。
比如:
(前门上车—还剩N个座…)
**思路:**1.前中后三个门可以看做三个线程,使用同一资源座位,于是要把使用的过程放在同步代码块中进行,还可以放在同步方法中进行。
2.上车人数不确定,由随机数产生。
代码:
import java.util.Random;
/**
* @author Administrator
* 有一辆班车除司机外只能承载80个人,假设前中后三个车门都能上车(每次从一个门上车,且上车人数不能超过剩余座位数),如果坐满则不能再上车。
请用线程模拟上车过程并且在控制台打印出是从哪个车门上车以及剩下的座位数。
比如:
(前门上车---还剩N个座...)
*/
public class TakeCar implements Runnable {
static int seats = 80;
static Random ran = new Random();
// 实现乘客上车的功能
@Override
public void run() {
while (true) {
//同步代码块
synchronized (ran) {
if (seats>0) {
// 每次上车人数,保证上车人数不大于剩余座位数
int on = ran.nextInt(seats)+1;
seats = seats-on;
System.out.println(Thread.currentThread().getName()+"上车"+on+"人,还剩"+(seats)+"座位");
}
}
// takeCars();
}
}
// 同步方法解决线程安全问题
private static synchronized void takeCars() {
// TODO Auto-generated method stub
if (seats>0) {
int on = ran.nextInt(seats)+1;
seats = seats-on;
System.out.println(Thread.currentThread().getName()+"上车"+on+"人,还剩"+(seats)+"座位");
}
}
}
测试类:
public class TestCar {
public static void main(String[] args) {
TakeCar tc = new TakeCar();
// 创建三个线程,分别表示前门,后面,中门上车情况
Thread t1 = new Thread(tc, "前门");
Thread t2 = new Thread(tc, "中门");
Thread t3 = new Thread(tc, "后门");
// 开启三个线程,上车
t1.start();
t2.start();
t3.start();
}
}
Showtime: