[英]Java thread stuck after join
我有這個Transmitter類,其中包含一個BufferedReader和一個PrintWriter。 在主類上,該想法是在主套接字上使用Transmitter.receive()和Transmitter.transmit()。 問題是:
public void receive() throws Exception {
// Reads from the socket
Thread listener = new Thread(new Runnable() {
public void run() {
String res;
try {
while((res = input.readLine()) != null) {
System.out.println("message received: " + res);
outputMessage = (res);
if (res.equals("\n")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
};
});
listener.start();
listener.join();
}
線程更改了“ outputMessage”值,我可以使用輔助方法來獲取該值。 問題是,如果沒有加入,我的客戶會得到outputMessage,但是我想在主類上多次使用它,如下所示:
trans1.receive();
while(trans1.getOutput() == null);
System.out.println("message: " + trans1.getOutput());
但是加入這個trans1.receive()
永遠不會執行,因為trans1.receive()
被卡住了...有什么想法嗎?
編輯1:這是發射器類https://titanpad.com/puYBvlVery
您可以發送\\n
; 這並不意味着您會在Java代碼中看到它。
就像Javadoc中對BufferedReader.readLine()
所說的(強調我的):
(返回)一個包含行內容的字符串, 不包含任何行終止符
因此"\\n"
將永遠不會返回。
這樣做:
{
Thread listener = new Thread(new Runnable() {
public void run() {
doSomeWork();
};
});
listener.start();
listener.join();
}
將創建一個新線程,然后等待它完成工作。 因此,它與直接進行的操作大致相同:
doSomeWork();
新線程在這里沒有任何實際用途。
另外,額外的線程會引入同步問題,因為在您的代碼中您無法確保變量同步。
第三,您的線程將循環讀取輸入中的行,直到沒有更多要讀取的內容為止,除非另一端關閉流,否則它將阻塞readLine()調用。 您將在getOutput()中看到的是一條隨機行,該行剛好在您看的那一刻出現,下一次您看它可能是同一行或完全不同的一行; 無需您從主線程注意到它,某些行將立即被讀取和忘記。
當您實際上需要從輸入中獲取換行消息時,只需在主線程中直接調用input.readLine()即可,而無需額外的閱讀器線程。 您可以按照yshavit的建議將讀取的消息存儲到Queue中,如果需要的話(例如出於性能原因),最好在消息可用時立即讀取它們並將它們准備好放在內存中。 但是,如果您只需要一一閱讀消息,那么僅在實際需要時才可以調用input.readLine()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.