繁体   English   中英

加入后Java线程卡住了

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM