我正在爲Java遊戲編寫一個Java程序。一個線程爲Manager和Worker線程管理時間併爲它們發送檢測信號。 Manager收集並解釋來自服務器的消息,並且Worker線程從Manager接收命令(具有類中的詳細信息)並對此信息起作用。Java中的多線程死鎖
現在,我遇到了多線程死鎖問題,我不確定是否有替代方案。
以下是我的管理器類中的一些方法:當用戶單擊按鈕時,我從GUI線程中調用getMessageFromUsername。以下方法從另一個線程中調用。
private ArrayList<Message> MessageList = new ArrayList<>();
public synchronized Message getMessageFromUsername(String username) {
for(Message msg : MessageList) {
if(msg.username.equalsIgnoreCase(username)) {
Message m = new Message(msg.num, msg.username, msg.id);
return m;
}
}
return null;
}
我的管理器線程從套接字讀取信息,並在連續循環中向MessageList添加信息。 (另外一個,即)
private synchronized void parseMessage() {}
private void main() { while(1) { parseMessage(/*Adds message to MessageList*/); Sleep(); } }
現在,我的問題是一個相當noobie發出─因爲如果我要寫信給我MessageList中必須使用同步訪問。但是,由於這發生在一個循環中,並且消息不斷通過套接字進入,它會導致死鎖,因爲它會一直鎖定我的對象,並且這發生在循環中。
我該怎麼做才能解決死鎖問題?
最簡單的方法是在循環中添加一些暫停。你可以使用'Thread.sleep()' –
我在我的循環中使用了100毫秒的暫停,但由於某種原因它仍然發生死鎖。什麼是暫停的好時機? – Jason
錯錯了錯! @ bali182請說你在拖他!睡眠怎樣才能成爲僵局的妥善解決方案?另一方面,你究竟在哪裏看到了僵局?你在這裏是一個飢餓的線程的例子。 '同步的'原語不適合你,你應該選擇一些優先機制。 –