2016-06-10 38 views
0

要求如下:主線程需要產生n個線程。他們將通過頻道發送和接收消息。一旦我收到n/2 + 1 acks,Master就會繼續進行。處理使用CountDownLatch的其餘線程

使用CountDownLatch如下。問題在於線程的Ack未被接收(在倒計數變爲零之前)是纏繞導致新線程創建內存異常的原因。

代碼是這樣的:

final CountDownLatch Acks = new CountDownLatch(n/2+1); 

for (SocketChannel r : n) { 
    new Thread() { // creating n threads over n channels 
     @Override 
     public void run() { 
      synchronized(r) { 
        write the message over channel r 
        received the Ack over channel r 
        Acks.countDown(); <<< used for decrements 
      } 
     } 
} 

Acks.await(); <<<Master will wait till countDown becomes zero then proceed 
+0

你是說所有的線程Acks *都應該被接收,但不是?或者,當倒計時到達零時,無論是否收到確認,您都希望它們關閉? –

+0

是的,我希望他們在倒計時達到零時關閉,無論他們的ack是否已收到... – recovery

回答

0

不知道我清楚地瞭解,但一般你會希望使用一個線程池來實現這種機制。

0

我寧願用嘗試捕捉這一部分

與所謂的「ClosedChannelException」異常收到ACK在槽R

塊,和主誰的Ack到達後已經甦醒0,應關閉此連接,異常將上升,並且線程將結束。

編輯: 或嘗試建立超時上閱讀: Timeout for SocketChannel doesn't work

0

當你接收N AKS/2,你無法控制的正在發生的事情與你的N/2個線程的其餘部分。一種解決方案可能是創建所有正在運行的線程的列表,並且只要您收到(n/2 + 1)Aks,就應該查看列表並明確清除剩餘的線程。或者你可以估計大約(n/+1)Aks的運行時間,並將該時間設置爲所有線程的超時時間。