2016-06-10 39 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的运行时间,并将该时间设置为所有线程的超时时间。