要求如下:主线程需要产生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
你是说所有的线程Acks *都应该被接收,但不是?或者,当倒计时到达零时,无论是否收到确认,您都希望它们关闭? –
是的,我希望他们在倒计时达到零时关闭,无论他们的ack是否已收到... – recovery