资讯专栏INFORMATION COLUMN

【全栈之路】JAVA基础课程五_哲学家就餐问题(20190614v1.2)

JerryZou / 1810人阅读

摘要:欢迎进入基础课程博客地址本系列文章将主要针对一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。若有问题请及时留言或加。

欢迎进入JAVA基础课程

博客地址:https://blog.csdn.net/houjiyu...
本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触JAVA开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。若有问题请及时留言或加QQ:243042162。

寄语:
你失落过吗?你紧张过吗?你憧憬过吗?无论生活琐事中还是繁忙的工作中,我想大部分人会遇到类似的情况,无形中压力、失落、失望像座大山一样顶在自己的胸口闯不过起来。于是,你开始憧憬,开始幻想,要我是换个方式结局可能就不一样了。殊不知,人生没有如果!调整好心态,未雨绸缪,天道酬勤!
生产者消费者问题

1. 背景

有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,进餐完毕,放下筷子又继续思考。

2. 代码实现

//定义哲学家类,每个哲学家相当于一个线程
class Philosopher extends Thread{
    private String name;
    private Fork fork;
    public Philosopher(String name,Fork fork){
        super(name);
        this.name=name;
        this.fork=fork;
    }
    public void run(){//每个哲学家的动作,思考-》拿起筷子-》吃-》放下筷子
        while (true){
            thinking();
            fork.takeFork();
            eating();
            fork.putFork();
        }
    }

    //模拟思考
    public void thinking(){
        System.out.println("我在思考:"+name);
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //模拟吃放
    public void eating(){
        System.out.println("我在吃:"+name);
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


class Fork{
    //5双筷子,初始未未使用
    private  boolean[] used={false,false,false,false,false};

    //拿起筷子
    public synchronized void takeFork(){
        String name=Thread.currentThread().getName();
        int i=Integer.parseInt(name);
        while (used[i]||used[(i+1)%5]){//左右手有一只被使用则等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        used[i]=true;
        used[(i+1)%5]=true;
    }

    //释放筷子
    public  synchronized void putFork(){
        String name=Thread.currentThread().getName();

        int i=Integer.parseInt(name);
        used[i]=false;
        used[(i+1)%5]=false;
        notifyAll();
    }


}

public class PhilosopherMain {
    public static void main(String[] args) {
        Fork fork=new Fork();
        new Philosopher("0",fork).start();
        new Philosopher("1",fork).start();
        new Philosopher("2",fork).start();
        new Philosopher("3",fork).start();
        new Philosopher("4",fork).start();
    }
}

输出结果

我在思考:0
我在思考:1
我在思考:2
我在思考:3
我在思考:4
我在吃:0
我在吃:2
我在思考:0
我在吃:4
我在思考:2
我在吃:1
我在思考:4
我在吃:3
我在思考:1
我在吃:0
我在思考:3
我在吃:2
我在思考:0
我在吃:4
我在思考:2
我在吃:1
我在思考:4
我在吃:3
我在思考:1
我在吃:0
我在思考:3
我在吃:2
我在思考:0
我在吃:4
我在思考:2

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104700.html

相关文章

  • 全栈之路JAVA基础课程_学家就餐问题20190614v1.2

    摘要:欢迎进入基础课程博客地址本系列文章将主要针对一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。若有问题请及时留言或加。 欢迎进入JAVA基础课程 博客地址:https://blog.csdn.net/houjiyu...本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触JAVA开发菜鸟还是业界...

    Mr_houzi 评论0 收藏0
  • 全栈之路JAVA基础课程_生产者消费者问题20190614v1.1)

    摘要:寄语天眼之父南仁东,心无旁骛,为崇山峻岭间的中国天眼燃尽生命,看似一口大锅,天眼是世界上最大最灵敏的单口径射电望远镜,可以接受百亿光年外的电磁信号。南仁东总工程师执着追求科学梦想的精神,将激励一代又一代科技工作者继续奋斗,勇攀世界科技高峰。 欢迎进入JAVA基础课程 博客地址:https://segmentfault.com/a/11...本系列文章将主要针对JAVA一些基础知识点进行...

    lemon 评论0 收藏0
  • 全栈之路JAVA基础课程_生产者消费者问题20190614v1.1)

    摘要:寄语天眼之父南仁东,心无旁骛,为崇山峻岭间的中国天眼燃尽生命,看似一口大锅,天眼是世界上最大最灵敏的单口径射电望远镜,可以接受百亿光年外的电磁信号。南仁东总工程师执着追求科学梦想的精神,将激励一代又一代科技工作者继续奋斗,勇攀世界科技高峰。 欢迎进入JAVA基础课程 博客地址:https://segmentfault.com/a/11...本系列文章将主要针对JAVA一些基础知识点进行...

    everfight 评论0 收藏0
  • 全栈之路JAVA基础课程_多线程和死锁(20190614v1.0)

    摘要:一个进程可以有多个线程。线程又叫做轻量级进程。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。不剥夺条件进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放只能是主动释放。 欢迎进入JAVA基础课程 博客地址:https://blog.csdn.net/houjiyu...本系列文章将主要针对JAVA一些基础知识点进...

    Allen 评论0 收藏0
  • 全栈之路JAVA基础课程_多线程和死锁(20190614v1.0)

    摘要:一个进程可以有多个线程。线程又叫做轻量级进程。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。不剥夺条件进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放只能是主动释放。 欢迎进入JAVA基础课程 博客地址:https://blog.csdn.net/houjiyu...本系列文章将主要针对JAVA一些基础知识点进...

    warnerwu 评论0 收藏0

发表评论

0条评论

JerryZou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<