2017-01-31 102 views
0

首先,是的,我在谷歌上查找了這個問題,我沒有找到任何答案。只有線程完成並且返回值的答案。我想要的是返回一個「無限」數量的值。從線程返回一個值

只是爲了讓你更清楚:我的線程正在讀取來自套接字的消息,並沒有真正完成。所以每當有新消息進來時,我都希望另一個班級得到這個消息。我會怎麼做?

public void run(){ 
      while(ircMessage != null){    
      ircMessage = in.readLine(); 
      System.out.println(ircMessage);   
       if (ircMessage.contains("PRIVMSG")){     
        String[] ViewerNameRawRaw; 
        ViewerNameRawRaw = ircMessage.split("@"); 

        String ViewerNameRaw = ViewerNameRawRaw[2]; 
        String[] ViewerNameR = ViewerNameRaw.split(".tmi.twitch.tv"); 
        viewerName = ViewerNameR[0]; 

        String[] ViewerMessageRawRawRaw = ircMessage.split("PRIVMSG"); 
        String ViewerMessageRawRaw = ViewerMessageRawRawRaw[1]; 
        String ViewerMessageRaw[] = ViewerMessageRawRaw.split(":", 2); 
        viewerMessage = ViewerMessageRaw[1]; 

       }   
      }  
    } 
+0

那麼,你應該試圖瞭解這些答案,'的run()'不返回任何東西,所以這通常調用一個方法(使用事件或其他東西),這可以在你想要的時候完成。 – AxelH

+1

您可以使用線程放置消息的隊列。用戶將從隊列中獲取消息。請參閱http://stackoverflow.com/questions/2332537/producer-consumer-threads-using-a-queue –

+0

@AxelH我知道它不會返回任何東西。這是我的問題。 「我如何從這個線程返回值」? – TomiG

回答

0

您所描述的是異步通信的典型場景。通常解決方案可以使用Queue實現。你的主題是製片人。每次線程從套接字讀取消息時,都會生成結果並將其發送到隊列中。任何有興趣接收結果的實體都應該監聽隊列(即成爲消費者)。閱讀有關隊列的更多信息,因爲您可以發送消息,以便只有一位消費者能夠獲得或發佈意味着所有註冊的消費者都可以獲得。隊列實現可以是一個可用的產品,例如Rabbit MQ,或者像Java提供的類一樣簡單,可以像內存隊列一樣工作。 (請參閱Queue接口及其各種實現)。

另一種解決方法是通過網絡(HTTP)進行通信。您的線程從套接字讀取消息,生成一個結果並通過http發送它,讓我們說一個REST協議給消費者,該消息展示了您的線程可以調用的其餘API。

+0

另一種方法是有一個監聽器,一個事件發生時將被調用的接口(搜索觀察者模式) – gusto2

+0

但是監聽器將在它的同一線程中運行將在這個線程內被調用,這不是OP想要的 –

0

爲什麼你的線程類沒有狀態變量?然後,您可以在執行期間和退出之前更新此文件。線程完成後,您仍然可以查詢狀態。

public static void main(String[] args) throws InterruptedException { 

    threading th = new threading(); 

    System.out.println("before run Status:" + th.getStatus()); 
    th.start(); 
    Thread.sleep(500); 
    System.out.println("running Status:" + th.getStatus()); 
    while(th.isAlive()) {} 
    System.out.println("after run Status:" + th.getStatus()); 
} 

延長線爲:

public class threading extends Thread { 

    private int status = -1; //not started 

    private void setStatus(int status){ 
     this.status = status; 
    } 

    public void run(){ 
     setStatus(1);//running 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     } 

     setStatus(0); //exit clean 
    } 

    public int getStatus(){ 
     return this.status; 
    } 
} 

,並得到一個輸出:

before run Status:-1 
running Status:1 
after run Status:0