2013-12-09 67 views
2

我正在使用套接字的Java項目。由於套接字方法是阻塞方法,我不得不製作一個多線程應用程序。多線程返回值

截至目前,我能夠從其他應用程序讀取傳入字節。我把它們寫入一個StringBuilder。我的問題是如何將這個字符串返回到我的主線程。我正在考慮類似事件的事情,只要Socket-Thread讀完就可以調用它。

我很高興爲任何想法。

public class SocketRunnable implements Runnable { 

private final Socket _socket; 


public SocketRunnable(Socket socket){ 
    this._socket = socket; 
} 

@Override 
public void run() { 
    StringBuilder sb = new StringBuilder(); 
    try { 
     BufferedReader bufferedReader = 
       new BufferedReader(
        new InputStreamReader(
         this._socket.getInputStream())); 


    char[] buffer = new char[100]; 
    int amountOfBytes = bufferedReader.read(buffer, 0, 100); // blocks until the message is received. 
    String message = new String(buffer, 0, amountOfBytes); 
    sb.append(message); 

    } catch (IOException ex) { 
     Logger.getLogger(SocketRunnable.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    finally{ 

     // Return (!) 
    } 

} 
+0

爲什麼你需要將它返回到你的主線程?你需要做什麼這個返回的字符串? –

+0

我想讓它在文本框中可見。所以我想把這個字符串返回給處理這個人的mainThread。 –

+0

如果您在Swing上,則使用EventQueue.invokeLater將事件發佈到Event-Dispatch Thread。但我懷疑你的問題在於切換線程:它正在從外部線程訪問適當的對象。 –

回答

3

我的問題是如何將此字符串返回到我的主線程。

你不能—不是由於任何技術障礙,而是因爲它沒有概念意義。您的主線程已經消失,您的返回值有意義的上下文丟失了。

所以,要麼:

  • 你的主線程必須阻止接收結果(但什麼是多線程隨後的點);

  • 你的主線程已經從面向事件的方式的基礎上設計的,並具有外事件循環這需要事件掀起了隊列和處理它們(這一點,如果你正在建設一個GUI應用程序是真實的)。

什麼更有意義是使結果可用其他一些代碼。它可以發生在同一個線程中,即接收到的線程。您只需調用適當的方法即可實現此目的。所以,在你的設計中要解決的問題是,如何使一個實例具有該方法在讀線程中執行的代碼。

+0

+1我假設他會從主線程中進行輪詢。所以在'SocketRunnable'上使用volatile字段可能就足夠了。 – Gray

+0

我正在使用MVC模式,並且我的Socket-Thread在模型類中工作。直到現在,整個主線程都是基於事件的,但我並不熟悉外部事件循環。也許我已經在實施這個,但沒有意識到。也許SwingWorker是更好的方式去? –

+0

是的,你可以使用'SwingWorker'作爲異步任務,這將很好地照顧樣板問題。 –

0

將結果字符串寫入阻塞隊列,並讓該線程的主線程polltake

1

顯示結果爲一個Swing文本字段您可以處理結果,一旦你的字符串只是做:

final String msg=???; // Insert your string here 

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     textBox.setText(msg); 
    } 
}); 

的invokeLater的通話將讓你在正確的線程修改文本內容領域。