标签:私有变量 sleep code 对象 使用 his oid 控制台 tar
描述:
有一辆班车除司机外只能承载80个人,假设前中后三个车门都能上车,如果坐满则不能再上车。请用线程模拟
上车过程并且在控制台打印出是从哪个车门上车以及剩下的座位数。
比如:(前门上车---还剩N个座...)
自己的代码:
public class Test03 {
public static void main(String[] args) {
Bus bus = new Bus();
new Thread(bus,"前门").start();
new Thread(bus,"中门").start();
new Thread(bus,"后门").start();
}
}
class Bus implements Runnable{
// 有一辆班车除司机外只能承载80个人
// 作为数量是竞争资源,定义为私有变量
private int seatLeft = 80;
private int seat = 0;
@Override
public void run() {
String name = Thread.currentThread().getName();
while (true){
synchronized (this){
if(seatLeft>0){
seatLeft--;
seat++;
System.out.println(name+"上车,已经坐了"+seat+"个座位,还剩"+seatLeft+"个座位");
}else {
break;
}
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
中门上车,已经坐了1个座位,还剩79个座位
前门上车,已经坐了2个座位,还剩78个座位
后门上车,已经坐了3个座位,还剩77个座位
中门上车,已经坐了4个座位,还剩76个座位
前门上车,已经坐了5个座位,还剩75个座位
后门上车,已经坐了6个座位,还剩74个座位
中门上车,已经坐了7个座位,还剩73个座位
前门上车,已经坐了8个座位,还剩72个座位
.
.
.
*/
答案(使用Lock锁):
public class Demo03 {
public static void main(String[] args) {
// 创建抢座的任务: 实现了Runnable接口
GrabSeat gs = new GrabSeat();
// 创建上车的三个线程
Thread t1 = new Thread(gs, "前门上车");
Thread t2 = new Thread(gs, "中门上车");
Thread t3 = new Thread(gs, "后门上车");
//开启线程
t1.start();
t2.start();
t3.start();
}
}
class GrabSeat implements Runnable {
// 有一辆班车除司机外只能承载80个人
// 作为数量是竞争资源,定义为私有变量
private int count = 80;
// 创建锁对象
private Lock lock = new ReentrantLock();
@Override
public void run() {
// 获取当前线程的名称
String name = Thread.currentThread().getName();
// 开始上车
while(true) {
try {
// 获取锁
lock.lock();
// 如果还有坐位,就抢座
if(count > 0) {
// 抢掉一个座位,少一个座位
count--;
// 上车---还剩N个座...
System.out.println(name + "---还剩"+count+"个坐");
}
//竞争资源访问完毕,释放锁
lock.unlock();
// 抢完一个坐睡小下,给其他线程一个抢座的机会
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//竞争资源访问完毕,释放锁
// lock.unlock();
}
}
}
}
标签:私有变量 sleep code 对象 使用 his oid 控制台 tar
原文地址:https://www.cnblogs.com/liqiliang1437/p/13112253.html