码迷,mamicode.com
首页 > 其他好文 > 详细

大巴三个门同时上人(lock锁)

时间:2020-06-13 13:06:15      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:私有变量   sleep   code   对象   使用   his   oid   控制台   tar   

大巴三个门同时上人(lock锁)

描述:

有一辆班车除司机外只能承载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();
            }
        }
    }
}

大巴三个门同时上人(lock锁)

标签:私有变量   sleep   code   对象   使用   his   oid   控制台   tar   

原文地址:https://www.cnblogs.com/liqiliang1437/p/13112253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!