java 多线程实现 哲学家进餐问题
来源:互联网 发布:js什么是递归算法 编辑:程序博客网 时间:2024/04/30 22:44
/** * 在1965年,Dijkstra提出并解决了一个他称之为哲学家进餐的同步问题。从那时起,每个发明新的同步原语的人都希望通过解决哲学家进餐间题来展示其同步原语的精妙之处。这个问题可以简单地描述:五个哲学家围坐在一张圆桌周围,每个哲学家面前都有一碟通心面,由于面条很滑,所以要两把叉子才能夹住。相邻两个碟子之间有一把叉子。 * 哲学家的生活包括两种活动:即吃饭和思考。当一个哲学家觉得饿时,他就试图去取他左边和右边的叉子。如果成功地获得两把叉子,他就开始吃饭,吃完以后放下叉子继续思考。 * 要保证哲学家不能饿死,就是就餐数一直为0;不能出现死锁和活锁. * @author lijianji * */public class Test2 {public static void main(String[] args) {Fork aFork=new Fork("a");Fork bFork=new Fork("b");Fork cFork=new Fork("c");Fork dFork=new Fork("d");Fork eFork=new Fork("e");Scientist scientistA=new Scientist("A",eFork,aFork);Scientist scientistB=new Scientist("B",aFork,bFork);Scientist scientistC=new Scientist("C",bFork,cFork);Scientist scientistD=new Scientist("D",cFork,dFork);Scientist scientistE=new Scientist("E",dFork,eFork);new Thread(scientistA).start();new Thread(scientistC).start();new Thread(scientistB).start();new Thread(scientistE).start();new Thread(scientistD).start();}}/** * 科学家 * @author lijianji * */class Scientist implements Runnable{private String name;/** * 左餐叉 */private Fork leftFork;/** * 右餐叉 */private Fork rightFork;/** * 就餐次数 */private int counts=0;public Scientist(String name,Fork leftFork, Fork rightFork){this.name=name;this.leftFork=leftFork;this.rightFork=rightFork;}@Overridepublic void run() {//随机开始就餐或思考int k=(int)Math.random()*10;if(k%2==0){this.dining();}else{this.thinking();}}/** * 进餐 */private void dining(){try {synchronized (leftFork) {synchronized (rightFork) {counts++;System.out.println(name + ",开始进餐" + ", 用餐次数:" + counts+ ", leftFork:" + leftFork.getName()+ ", rightFork:" + rightFork.getName());for (int i = 0; i < 10; i++) {//System.out.println("\t\t\t\t "+name+":用餐时间:"+i);Thread.sleep(100);}}}this.thinking();} catch (InterruptedException e) {e.printStackTrace();}}/** * 思考 */private void thinking(){try {Thread.sleep(2000);//System.out.println(name+":思考 完2s,开始抢餐叉");this.dining();} catch (InterruptedException e) {e.printStackTrace();}}}/** * 餐叉 * @author lijianji * */class Fork{private String name;public Fork(String name){this.name=name;}public String getName(){return name;}}
0 0
- java 多线程实现 哲学家进餐问题
- Java 多线程-哲学家进餐问题
- Java实现哲学家进餐问题
- 尝试解决哲学家进餐问题(Java实现)
- C-多线程-哲学家进餐问题
- java实现哲学家进餐问题,及其死锁问题的解决
- 哲学家进餐问题的C语言实现
- 哲学家进餐问题的算法与实现
- 哲学家进餐问题C语言实现
- 哲学家进餐问题
- 哲学家进餐的问题
- 哲学家进餐问题
- 哲学家进餐问题
- 关于哲学家进餐问题
- 哲学家进餐问题
- 哲学家进餐问题
- 哲学家进餐问题
- 关于哲学家进餐问题
- PHP内置的Web Server的使用
- 红黑树
- 模拟器不能联网解决办法
- bzoj1084【SCOI2005】最大子矩阵
- 第十一章关联容器
- java 多线程实现 哲学家进餐问题
- usaco 4.3 Buy Low, Buy Lower 2010.8.5
- android actionbar的学习笔记
- Python教程学习简记11--Python decorator 装饰器
- usaco 4.3 the primes 2010.8.6
- 02环信集成SDK基础功能 - 退出登录
- 使用GoAgent代理出现405错误
- 1593: [Usaco2008 Feb]Hotel 旅馆
- android marginLeft与marginStart