2011-07-31 177 views
4

Thread A正在總結從10個客戶端傳來的數據。2個線程如何相互溝通?

while(true){ 
    Socket clientfd= server.accept(); 
    BufferedReader message = new BufferedReader(new InputStreamReader (clientfd.getInputStream())); 
    String val = message.readLine(); 
    this.sum_data+=(message.readLine(); 
    message.close(); 
    clientfd.close(); 
    this.left--; 
    if(this.left==0){ 
     System.out.println(this.sum_data); 
     break; 
    } 
} 

Thread B不斷與客戶溝通,他們是否還活着與否(心跳技術)。

問題是,客戶端有時可能會失敗,在這種情況下,總結數據的線程應該打印出活動客戶端的所有可能結果。否則,它將永遠不會打印出結果。

所以,如果心跳線程注意到一個客戶端沒有響應,有沒有辦法讓它告訴其他線程(或更改其他線程的類變量this.left)?

回答

8

基本上有線程通信兩種一般的方法:

  1. 共享存儲器
  2. 基於

在共享存儲器的方法,可以創建AA同步列表

  • 事件/隊列或兩個線程都可以讀取和寫入的同步映射。通常,確保讀取和寫入不會發生衝突會導致一些開銷,例如,您不希望在閱讀時刪除正在閱讀的對象。 Java提供了很好的集合,如Collections.synchronizedMapCollections.synchronizedList

    在基於事件或基於隊列的線程通信中,線程具有傳入隊列並寫入其他線程的傳入隊列。在這種情況下,您可能會將心跳線程加載到客戶端讀取的隊列中,並讓其他線程從該隊列中輪詢/獲取並執行處理。心跳線程可以不斷向這個隊列添加活動的客戶端,以便處理線程「知道」繼續處理它們。