2016-02-27 67 views
0

我有多個線程發送相同的數據包,並希望所有這些完成,然後再繼續發送下一個數據包。Java CyclicBarrier

我測試出的CyclicBarrier用下面的代碼:Test Code (was too long/messy to embed) 這個工作如預期打印的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?

P.S.我要指出,如果我用一個for循環,但不啓動它按預期工作即:

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

如果代碼過長/雜亂地張貼,然後將其縮減爲一個完整的可編譯的,可運行的樣本,證明問題。 –

+0

@JimGarrison對不起,我不能發佈完整的代碼,因爲它涉及許多其他類,也是一個項目。我鏈接的樣本基本上是特定班級試圖做的和可編譯的。 – user3669539

+1

你實際上沒有問過問題或說過問題。你看到了什麼問題? _是否有問題?如果沒有,那麼這是脫離主題,屬於[codereview.se]。 –

回答

0

是的,CyclicBarrier使用在這個例子中正確的新主題。

要知道一點的:

  1. 根據代碼的障礙必須被初始化爲sendSocketList.size()+1因爲也有在主線程調用await()barrier = new CyclicBarrier(sendSocketList.size()+1);