处理CountDownLatch使用中的剩余线程

时间:2016-06-10 18:35:55

标签: java

要求如下:主线程需要生成n个线程。他们将通过频道发送和接收消息。一旦我收到n / 2 + 1 ack,Master将继续进行。

使用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

3 个答案:

答案 0 :(得分:0)

不确定我是否清楚地理解,但通常你会想要使用线程池来实现这种机制。

答案 1 :(得分:0)

我宁愿在这部分使用 try catch

  

收到Ack over channel r

有一个名为“ClosedChannelException”的异常,并且在Acks达到0后唤醒的Master应该关闭此连接,异常将上升,并且线程将结束。

编辑: 或者尝试在阅读时设置超时: L.mapbox.geocoderControl

答案 2 :(得分:0)

当您收到无法使用的A / 2时,您无法控制其余n / 2个线程的运行情况。一种解决方案可能是创建所有正在运行的线程的列表,并且一旦收到(n / 2 + 1)Aks,就应该检查列表并显式删除剩余的线程。或者您可以近似评估(n / +1)Aks的运行时间,并将该时间设置为所有线程的超时。