要求如下:主线程需要生成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
答案 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的运行时间,并将该时间设置为所有线程的超时。