多執行緒 哲學家就餐問題

2021-07-03 15:19:03 字數 2575 閱讀 4356

1、當哲學家的左右筷子均是可用的時候才能就餐,否則等待,很容易理解,一次最多能有兩個人同時就餐

public

class

philosophereating

//當前執行緒組活動執行緒數

while(thread.activecount()>1)catch(interruptedexception ex)

}}}/*

* 哲學家程序

*/class philosopher implements runnable

public

void

run()else}}

//就餐

private

void

eat()catch(interruptedexception ex)

}//思考

private

void

think()catch(interruptedexception ex)

}}/*

* 筷子

* 作為資源

*/class chopstick

used[id] = true;

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

}catch(interruptedexception ex)finally

}//放筷子

public

void

down(int id)

//監控是否發生死鎖,如果所有的筷子都是使用狀態,則說明死鎖

public

static

boolean

monitor()

}return flag;}}

2、建立乙個服務員,每次哲學家就餐都需要詢問服務員

public

class

philosophereating2

//當前執行緒組活動執行緒數

while(thread.activecount()>1)

trycatch(interruptedexception ex)

}}}/*

* 哲學家程序

*/class philosopher implements runnable

public

void

run()

}else}}

//就餐

private

void

eat()catch(interruptedexception ex)

}//思考

private

void

think()catch(interruptedexception ex)

}}/*

* 服務員

*/class waiter

used[id] = true;

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

return

true;

}//交筷子

public

synchronized

void

put(int id)

//監控是否發生死鎖,如果所有的筷子都是使用狀態,則說明死鎖

public

static

boolean

monitor()

}return flag;}}

3、使用訊號量,每個哲學家只能先申請大號筷子,然後再申請小號筷子,即使是4號哲學家,也只能是先申請4號筷子,然後再申請0號筷子

public

class

philosophereating3

//當前執行緒組活動執行緒數

while(thread.activecount()>1)

}if(count == 5)

}trycatch(interruptedexception ex)

}}}/*

* 哲學家程序

*/class philosopher implements runnable

public

void

run()else}}

//就餐

private

void

eat()catch(interruptedexception ex)

}//思考

private

void

think()catch(interruptedexception ex)

}}/*

* 筷子

* 作為資源

*/class chopstick

}//取筷子

public

void

take(int id)else

}catch(interruptedexception ex)finally

}//放筷子

public

void

down(int id)else}}

多執行緒 哲學家就餐問題

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

多執行緒之哲學家就餐問題

該問題的描述是 五個哲學家共用一張圓桌,分別坐在周圍的5張椅子上,在圓桌上有5個碗和5只筷子,他們的生活方式是交替進行思考和進餐,平時,乙個哲學家進行思考和飢餓,平時,乙個哲學家進行思考,飢餓的時候便試圖取用其作用最靠近的筷子,只有在他拿到兩至筷子時才能進餐,進餐完畢,放下筷子進行思考 現在呢 我們...

Java多執行緒,哲學家就餐問題

問題描述 一圓桌前坐著5位哲學家,兩個人中間有乙隻筷子,桌子 有麵條。哲學家思考問題,當餓了的時候拿起左右兩隻筷子吃飯,必須拿到兩隻筷子才能吃飯。上述問題會產生死鎖的情況,當5個哲學家都拿起自己右手邊的筷子,準備拿左手邊的筷子時產生死鎖現象。解決辦法 1 新增乙個服務生,只有當經過服務生同意之後才能...