哲学家思考(多线程)
来源:互联网 发布:华威信科java培训骗局 编辑:程序博客网 时间:2024/05/18 00:00
该问题涉及到五个哲学家,他们交替地进行思考和进餐。他们分别坐在位于一个圆形餐桌周围的五把椅子上,圆桌中央是一碗米饭,餐桌上共有五根筷子,分别摆放在每两个相邻座位的中间。
当哲学家思考时,他不与其他人交谈。当哲学家饥饿时,他将拿起和他相邻的两根筷子进行进餐,但他很可能仅拿到一根,此时旁边的另一根正在他邻居的手中。只有他同时拿到两根筷子时他才能开始进餐。完成进餐后,他将两根筷子分别放回原位,然后再次开始思考。
下面是哲学家进餐问题的Java实现的代码,涉及到线程:
1/**//*
2 * 创建日期 2006-4-5
3 */
4package threadDemo;
5
6class ChopStick { //筷子类
7 boolean available;
8 ChopStick() {
9 available=true; //可以拿起
10 }
11 public synchronized void takeup() { //拿起动作
12 while(!available) {
13 try {
14 wait();
15 System.out.println("哲学家等待另一根筷子");
16 } catch(InterruptedException e) { }
17 }
18 available=false;
19 }
20
21 public synchronized void putdown() { //放下动作
22 available=true;
23 notify();
24 }
25}
26
27
28class Philosopher extends Thread { //哲学家类
29 ChopStick left, right;
30 int philo_num; //哲学家编号
31
32 Philosopher (int num, ChopStick c1, ChopStick c2) {
33 philo_num = num;
34 left = c1;
35 right = c2;
36 setDaemon(true); //此函数设true时,关闭主线程,子线程也跟着关闭
37 //否则,关闭主线程,子线程继续执行
38 }
39
40 public void eat() {
41 left.takeup();
42 right.takeup();
43 System.out.println("哲学家 " + (philo_num + 1) + " 正在进餐");
44 }
45
46 public void think() {
47 left.putdown();
48 right.putdown();
49 System.out.println("哲学家 " + (philo_num + 1) + " 正在思考");
50 }
51
52 public void run() {
53 while(true) {
54 eat();
55
56 try {
57 sleep(2000); //吃的时间是2秒
58 }
59 catch (InterruptedException e) {}
60
61 think();
62
63 try {
64 sleep(2000); //思考的时间也是2秒
65 }
66 catch (InterruptedException e) {}
67 }
68 }
69}
70
71
72public class Dining {
73 static ChopStick[] chopsticks = new ChopStick[5];
74 static Philosopher[] philos = new Philosopher[5];
75
76 public static void main(String args[]) {
77 for (int i = 0; i < 5; i ++ ) {
78 chopsticks[i] = new ChopStick();
79 }
80
81 for (int i = 0; i < 5; i ++ ) {
82 philos[i] = new Philosopher(i, chopsticks[i], chopsticks[(i + 1) % 5]);
83 }
84
85 for (int i = 0; i < 5; i ++) {
86 philos[i].start();
87 }
88
89 try
90 {
91 System.in.read(); //wait until Enter is pressed
92 for (int i = 0; i < 5; i ++) {
93
94 philos[i].interrupt();
95 }
96 }
97 catch(Exception e)
98 { }
99 }
100}
101
102
103
运行结果:
哲学家 1 正在进餐
哲学家 3 正在进餐
哲学家等待另一根筷子
哲学家 3 正在思考
哲学家等待另一根筷子
哲学家 5 正在进餐
哲学家等待另一根筷子
哲学家 2 正在进餐
哲学家 1 正在思考
哲学家 5 正在思考
哲学家 2 正在思考
哲学家等待另一根筷子
该文章转载自网络大本营:http://www.pushad.com/Info/3000.Html
- 哲学家思考(多线程)
- java多线程哲学家思考吃饭问题
- 多线程练习----哲学家问题
- 多线程_哲学家问题
- 多线程--哲学家就餐问题
- 哲学家多线程问题
- 多线程模拟哲学家就餐问题
- (急求急求!!!!!!!!!!!!!!!)多线程编程:哲学家问题
- linux多线程-哲学家就餐问题
- 多线程之哲学家就餐问题
- java多线程--哲学家就餐问题
- Java 多线程-哲学家进餐问题
- C-多线程-哲学家进餐问题
- linux下 多线程编程 哲学家就餐问题
- Linux 多线程同步之哲学家用餐问题
- linux多线程【3】哲学家用餐-mutex实现
- linux多线程【4】哲学家用餐-sem_t
- linux多线程【5】哲学家用餐-另一种思路
- ASP.NET 2.0中Gridview控件高级技巧
- ERROR ORA-01795 的简单解决方法。
- 保存图片到数据库
- jsp技巧大全
- 影响大学生就业的几个关键问题
- 哲学家思考(多线程)
- 上传下载全攻略jspSmartUpload
- java io 操作集合
- 使用FileReader和FileWriter读取写入文件内容
- 想加入圈子
- 生活真美好,我还活着
- 弈天网络工作室
- 工作以后感悟文章写作
- 当癞蛤蟆吃到天鹅肉