0

我有多个线程发送相同的数据包,并希望所有线程在继续发送下一个数据包之前完成。

我使用以下代码测试了 CyclicBarrier:测试代码(太长/太乱而无法嵌入) 这按预期工作,打印 0 - 4 的组合,然后在循环中完成

对于数据包发送方,代码是等价的,除了 for 循环是:

for(RSocket sendSocket : sendSocketList){
    new Thread(new Send(sendSocket , toServer)).start();
}
barrier.await();

发送是:

private class Send implements Runnable{
    private RSocket sendSocket;
    private MPacket packet;
    public Send(RSocket sendSocket, MPacket packet){
        this.sendSocket = sendSocket;
        this.packet = packet;
    }
    public void run(){
        sendSocket.send(packet);
        try {
            barrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

RSocket.send(数据包); 功能与常规套接字的 writeObject() 函数相同,除了它会阻塞直到完成(当它接收到 ACK 时)。假设网络方面是正确的,我是否正确使用了 CyclicBarrier?

PS我应该指出,如果我使用for循环而不启动新线程,它会按预期工作,即:

for(RSocket sendSocket : sendSocketList){
    sendSocket.send(toServer);
}
4

1 回答 1

0

是的,CyclicBarrier在这个例子中使用是正确的。

请注意一点:

  1. 根据代码,必须将屏障初始化为,sendSocketList.size()+1因为还有主线程调用await()barrier = new CyclicBarrier(sendSocketList.size()+1);
于 2016-02-29T07:24:54.523 回答