欢迎进入JAVA基础课程

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

谨记:
“天眼”之父南仁东,心无旁骛,为崇山峻岭间的中国“天眼”燃尽生命,看似一口“大锅”,天眼是世界上最大、最灵敏的单口径射电望远镜,可以接受百亿光年外的电磁信号。南仁东总工程师执着追求科学梦想的精神,将激励一代又一代科技工作者继续奋斗,勇攀世界科技高峰。作为IT界的从业者,我们需要紧跟时代的步伐,踏过平庸,一生为科技筑梦。

生产者消费者问题

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