欢迎进入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