共计 1839 个字符,预计需要花费 5 分钟才能阅读完成。
欢迎进入 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 |
正文完
2019-06-14