哲學家就餐成績中的JAVA多線程進修。本站提示廣大學習愛好者:(哲學家就餐成績中的JAVA多線程進修)文章只能為提供參考,不一定能成為您想要的結果。以下是哲學家就餐成績中的JAVA多線程進修正文
成績描寫:一圓桌前坐著5位哲學家,兩小我中央有一只筷子,桌子中心有面條。哲學家思慮成績,當餓了的時刻拿起閣下兩只筷子吃飯,必需拿到兩只筷子能力吃飯。上述成績會發生逝世鎖的情形,當5個哲學家都拿起本身右手邊的筷子,預備拿左手邊的筷子時發生逝世鎖景象。
處理方法:
1、添加一個辦事生,只要當經由辦事生贊成以後能力拿筷子,辦事生擔任防止逝世鎖產生。
2、每一個哲學家必需肯定本身閣下手的筷子都可用的時刻,能力同時拿起兩只筷子進餐,吃完以後同時放下兩只筷子。
3、劃定每一個哲學家拿筷子時必需拿序號小的那只,如許最初一名未拿到筷子的哲學家只剩下序號年夜的那只筷子,不克不及拿起,剩下的這只筷子便可以被其他哲學家應用,防止了逝世鎖。這類情形不克不及很好的應用資本。
代碼完成:完成第2種計劃
package cn.edu.sdust.Philosopher;
/*每一個哲學家相當於一個線程*/
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 eating(){
System.out.println("I am Eating:"+name);
try {
sleep(1000);//模仿吃飯,占用一段時光資本
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void thinking(){
System.out.println("I am Thinking:"+name);
try {
sleep(1000);//模仿思慮
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Fork{
/*5只筷子,初始為都未被用*/
private boolean[] used={false,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) {
// TODO Auto-generated catch block
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 ThreadTest {
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();
}
}
運轉成果:
I am Thinking:0
I am Thinking:2
I am Thinking:3
I am Thinking:1
I am Thinking:4
I am Eating:0
I am Eating:2
I am Thinking:0
I am Eating:4
I am Thinking:2
I am Eating:1
I am Thinking:4
I am Eating:3
I am Thinking:1
I am Eating:0
I am Thinking:3
I am Eating:2
I am Thinking:0
I am Eating:4
I am Thinking:2
剖析:上述處理計劃處理了逝世鎖成績。可以看到最多只能有兩條相鄰的eating成果,由於每一個時辰最多可以或許知足兩小我同時進餐,且兩人坐位不相鄰。