哲學家多執行緒問題

2021-07-23 20:07:05 字數 1521 閱讀 2891

問題描述:一圓桌前坐著5位哲學家,兩個人中間有乙隻筷子,桌子**有麵條。哲學家思考問題,當餓了的時候拿起左右兩隻筷子吃飯,必須拿到兩隻筷子才能吃飯。上述問題會產生死鎖的情況,當5個哲學家都拿起自己右手邊的筷子,準備拿左手邊的筷子時產生死鎖現象。

解決辦法:

1、新增乙個服務生,只有當經過服務生同意之後才能拿筷子,服務生負責避免死鎖發生。

2、每個哲學家必須確定自己左右手的筷子都可用的時候,才能同時拿起兩隻筷子進餐,吃完之後同時放下兩隻筷子。

3、規定每個哲學家拿筷子時必須拿序號小的那只,這樣最後一位未拿到筷子的哲學家只剩下序號大的那只筷子,不能拿起,剩下的這只筷子就可以被其他哲學家使用,避免了死鎖。這種情況不能很好的利用資源。 

**實現:實現第2種方案

複製**

**如下:

package cn.edu.sdust.philosopher;

/*每個哲學家相當於乙個執行緒*/

class philosopher extends thread

public void run()

}public void eating() catch (interruptedexception e)

}public void thinking() catch (interruptedexception e) }}

class fork;

/*只有當左右手的筷子都未被使用時,才允許獲取筷子,且必須同時獲取左右手筷子*/

public synchronized void takefork() catch (interruptedexception e)

}used[i ]= true;

used[(i+1)%5]=true;

}/*必須同時釋放左右手的筷子*/

public synchronized void putfork()

}//測試

public class threadtest }

執行結果:

複製**

**如下:

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結果,因為每個時刻最多能夠滿足兩個人同時進餐,且兩人座位不相鄰。

多執行緒 哲學家就餐問題

1 當哲學家的左右筷子均是可用的時候才能就餐,否則等待,很容易理解,一次最多能有兩個人同時就餐 public class philosophereating 當前執行緒組活動執行緒數 while thread.activecount 1 catch interruptedexception ex 哲...

多執行緒練習 哲學家問題

哲學家進餐問題 在多執行緒中如何避免死鎖。問題描述 有五位哲學家圍繞著餐桌坐,每一位哲學家要麼思考 要麼等待,要麼吃飯。為了吃飯,哲學家必須拿起兩支筷子 分 別放於左右兩端 不幸的是,筷子的數量和哲學家相等,所以每 只筷子必須由兩位哲學家共享 一 使用陣列來跟蹤乙個哲學家的的狀態 吃飯,思考或是試圖...

多執行緒 哲學家就餐問題

哲學家就餐問題可以這樣表述,假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一 吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手...