【发布时间】:2016-05-16 22:34:06
【问题描述】:
我有这个 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());
但是加入这个 system.out 永远不会执行,因为trans1.receive() 被卡住了......有什么想法吗?
编辑1:这里是发射器类https://titanpad.com/puYBvlVery
【问题讨论】:
-
不幸的是,该问题无法重现。您介意发布一个可运行的代码吗?
-
唯一的循环 while((res = input.readLine()) != null) ,但它不是空的,因为我的 erlang 服务器正在通过套接字发送东西。证据是,如果我删除 'join()' 它会起作用:/
-
我认为你在线程中的while循环永远不会结束;当它用完输入时,它会阻塞。所以线程永远不会结束,连接永远不会发生。发送完数据后,另一端是否关闭套接字?
-
如果不是
null,那么你的线程永远不会停止,因为循环不会退出。所以你永远不会回到主线程;.. -
不,另一端是我自己用erlang写的服务器。并且主进程,服务器本身,与套接字建立连接并且永远不会关闭。问题是,没有加入,消息被发送和接收,但如果我想使用相同的 trans1.receive() 它输出另一条消息,而不是当前的(从具有扫描仪类的用户接收)。跨度>
标签: java multithreading concurrency java-threads