簡體   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