我有這個Transmitter類,其中包含一個BufferedReader和一個PrintWriter。這個想法在主類中使用Transmitter.receive()和Transmitter.transmit()到主套接字。問題是:加入後Java線程卡住
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());
但隨着加入這個System.out的永遠不會執行,因爲trans1.receive()
被卡住。 .. 有什麼想法嗎?
編輯1:這裏是發射器類https://titanpad.com/puYBvlVery
不幸的是,問題不可重現。你介意請發佈一個可運行的代碼。 –
while((res = input.readLine())!= null)的唯一循環,但它不是null,因爲我的erlang服務器通過套接字發送東西。證明是,如果我刪除'join()'它的工作原理:/ –
我認爲你的循環在線程永遠不會結束;當輸入用完時,它會被阻塞。所以線程永遠不會結束,連接也不會發生。發送完數據後,另一端是否關閉了套接字? – antlersoft