哲學家就餐問題解決方案 java

2021-09-01 03:00:17 字數 2791 閱讀 5289

哲學家就餐問題是電腦科學中的乙個經典問題,用於演示在平行計算中多執行緒同步時產生的問題。題目要求是:五位哲學家圍著一張桌子而坐,他們不交談,每人面前放了一碗飯,每兩個人之間放了乙隻筷子(總共五隻筷子)。哲學家只能做兩件事,吃飯和思考,吃飯的時候不思考,思考的時候不吃飯。哲學家只有拿起自己身邊的兩隻筷子才能吃飯,拿筷子的順序是先拿左手再拿右手(不同時)。

因為哲學家之間不會交談,故可能會發生一些很嚴重的情況:

1、發生死鎖,即每個哲學家都左手拿著筷子,等待著右側的筷子空閒,這就發生了死鎖,誰也吃不了飯。

2、出現他們同時拿起左手的筷子,又同時放下左手的筷子,迴圈往復。

3、不加鎖則會出現五個人同時吃飯的情況。

這是乙個多執行緒的同步問題,如果簡單地讓五個執行緒去跑,則會出現五個執行緒對資源的同時使用(五個人同時吃飯)的情況,我們要為其方法加鎖。那麼什麼是鎖呢?每個物件都有一把唯一的鎖,假設我們這裡用到的是通過object類建立的obj物件,通過synchronize(obj) 方法我們可以使得被修飾的**塊獲得物件鎖,從而獲得競爭性資源的使用權,執行完**後會自動讓出物件鎖,其他執行緒便有機會獲得此鎖,得到競爭性資源的使用權。這樣你們是否覺得會出現哲學家輪流乙個乙個吃飯的問題,因為我們有五隻筷子,最多可以有兩個人同時吃飯,如果只有乙個人吃就會導致資源的浪費。我的解決思路是僅僅讓synchronize修飾取筷子的這個過程涉及到的**塊,這樣當乙個哲學家剛開始吃飯的時候,可以進行另乙個哲學家的取筷子判斷,這樣就可以有兩個哲學家同時吃飯了。

程式的流程是:判斷左右手是否同時有空閒的筷子,如果沒有,就持續思考,如果有,則先取左手筷子再取右手筷子,然後停止思考並吃飯,吃完飯後清洗筷子放到桌面並繼續思考,此時處於吃飽狀態,不會再重複吃飯。

1、測試類

public

class

test

;//筷子

for(

int i=

0;i<

5;i++)}

}

2、執行緒類

public

class

philosophy

extends

thread

public

void

run()}

public

void

eat(

)catch

(interruptedexception e)

chopsticks[

(this

.i+1)%

5]=true

;//表示筷子被拿起

this

.leftflag=

true

;//左手有筷子

system.out.

println

("哲學家"

+this

.i+"拿起了左邊的筷子");

trycatch

(interruptedexception e)

chopsticks[

this

.i]=

true

;this

.rightflag=

true

; system.out.

println

("哲學家"

+this

.i+"拿起了右邊的筷子");

}}if(

this

.leftflag&&

this

.rightflag&&

this

.hungry)

//滿足條件,開始吃飯

catch

(interruptedexception e)

system.out.

println

("哲學家"

+this

.i+"吃完了飯");

this

.hungry =

false

;//不餓了

trycatch

(interruptedexception e)

system.out.

println

("哲學家"

+this

.i+"擦淨並放下了筷子");

system.out.

println

("哲學家"

+this

.i+"開始思考");

this

.thinkflag=

true

;//思考標誌為true

this

.leftflag=

false

;//放下筷子,手上無筷子

this

.rightflag=

false

; chopsticks[i]

=false

;//筷子被放下

chopsticks[

(i+1)%

5]=false;}

}public

void

think()

}public

void

setobj

(object obj)

public

void

setchopsticks

(boolean

chopsticks)

}

3、程式執行結果截圖

這樣一來就可以實現兩個哲學家同時吃飯,不會因為筷子等問題而導致衝突,最後所有哲學家全部吃完飯進入思考狀態。

Java 哲學家就餐問題

問題描述 一群哲學家聚在一起就餐,每兩個哲學家之間有一根筷子。每個哲學家需要兩根筷子才能用餐,並且一定是先拿起左手邊的筷子,然後再拿右手邊的筷子。如果所有哲學家在同一時間拿起左手邊的筷子,就有可能造成死鎖。請使用執行緒和鎖,編寫模擬哲學家就餐問題。避免出現死鎖。解法 首先,先不管死鎖,實現哲學家就餐...

哲學家就餐問題

本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...

哲學家就餐問題

pragma once include include include include include include include include include include include include include stdafx.h handle chopstick 5 room l...