[英]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.