我有類Client和listRooms()方法。在Java中的多線程阻塞
public synchronized RoomInfo[] listRooms() {
sendMessage(new Message("@refresh"));
try {
System.out.println("#1");
wait();
System.out.println("#2");
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
if(m_RoomListMessage == null)
return null;
RoomInfo[] rooms = new RoomInfo[ m_RoomListMessage.getInteger(0) ];
for(int i=0; i<rooms.length; i++) {
rooms[i] = new RoomInfo(
m_RoomListMessage.getString(3*i + 1),
m_RoomListMessage.getBoolean(3*i + 2),
m_RoomListMessage.getInteger(3*i+3)
);
}
return rooms;
}
我也有類監聽器(擴展線程),它偵聽來自服務器的傳入消息。當消息到達監聽線程讀取消息(使用ObjectInputStream),然後調用下一個方法。
public synchronized void processMessage(Message aMessage) {
if(aMessage.type.equals("@roomlist")) {
m_RoomListMessage = aMessage;
notify();
System.out.println("notificiran xD");
return;
}
MessageHandler handler = m_MessageHandlers.get(aMessage.type);
if(handler == null) {
System.out.println("No MessageHandler for: " + aMessage.type);
return;
}
handler.onMessage(aMessage);
}
問題是它一直在等待。在我發送@refresh消息後,我的服務器顯示它發送了包含服務器上所有房間列表的消息,processMessage()永遠不會被調用,方法也是從Listener線程調用的,但listRooms()是從對象LobbyView調用的(擴展了View,它擴展了JPanel )附加到ClientWindow的對象(擴展JFrame),所以它是不同的線程。我不知道爲什麼它被阻止。所以監聽顯然不能稱之爲而processMessage,但我不知道爲什麼,或者我有Java線程的一些錯誤的認識:d
編輯:這也充分說明監聽線程被阻塞,出於某種原因...
請創建幷包含允許其複製的問題的最小示例(http://stackoverflow.com/help/mcve)。 – Vulcan
你是什麼'同步',你是誰'等'和'通知'?它看起來非常喜歡完全不同的類。 –
記得接受我的答案,如果它幫助你。謝謝。 – Gray