基本上,我打電話給BufferedReader.ReadLine();然而,我正在一個多線程服務器中,在這裏我正在同步樹中的一個節點。所以當這個ReadLine函數被調用時,如果有其他人到達該節點,它們被鎖定。我無法弄清楚如何在退出線程之前等待ReadLine等待響應的時間限制。我得到的最接近的是創建一個可以睡1ms的新線程,然後檢查設置ReadLine的變量是否更改。因此,像這樣:如何超時阻塞Java的函數?
synchronized (pointer) {
String answer = "";
Thread d = new Thread(new Runnable() {
public void run() {
try {
int i = 0;
while (answer.equals("")) {
if (i == 10000) {
System.out.println("Timeout Occured");
System.exit(0);
}
try {
Thread.sleep(1);
i++;
}
catch(Exception e) {
System.out.println("sleep problem occured");
}
}
}
catch (IOException ex) {
}
}
});
d.start();
answer = socketIn.readLine();
}
這做了什麼,我想它,但我無法弄清楚如何停止當前線程解鎖節點,以便其他用戶可以繼續,而不是殺死整個服務器。最後,我想也許我可以這樣做:
Thread d = new Thread(new Runnable() {
public void run() {
try {
answer = socketIn.readLine();
} catch (IOException ex) {
}
}
});
d.join(10000);
catch (InterruptedException e){
socketOut.println("Timeout Occured. Returning you to the beginning...");
socketOut.flush();
return;
}
但是,這似乎仍然阻止,無法繼續。有人可以幫我解決這個問題嗎?我無法理解我在做什麼錯了?
我也嘗試讓ExecutorService工作,但不能。這是我的答案嗎?我將如何實現它?
[編輯] socketIn是一個BufferedReader,應該說明確抱歉。 此外,客戶端通過telnet連接,但我認爲不重要。
我在這裏做的是一個「名人猜測遊戲」,用戶可以將名人添加到樹中。所以我需要鎖定該人員正在編輯的節點以保證線程安全
請參閱下面的回答 - 如果您在等待輸入時鎖定,則會卡住(除非您超時讀取,在這種情況下,您只是緩慢)。你上面的代碼更危險,因爲你正在開始一個新線程,並試圖讓兩個線程在不鎖定的情況下訪問'answer'(同步)。 – 2011-03-13 20:28:42