CyclicBarrier:导致屏障跳闸“y”的“x”个线程完成它们的执行并终止

Posted

技术标签:

【中文标题】CyclicBarrier:导致屏障跳闸“y”的“x”个线程完成它们的执行并终止【英文标题】:CyclicBarrier: Of 'x' threads that cause the barrier to trip 'y' complete their execution and terminate 【发布时间】:2014-05-11 07:37:10 【问题描述】:

我有一个 CyclicBarrier,当有“x”个参与方(线程)等待它时,它会跳闸。在这些“x”线程中,“y”的生命周期非常短,并且在成功完成执行后会很快终止。现在,屏障一直在等待并超时,因为它一直在等待“x”线程。我该如何解决这个问题?

CyclicBarrier barrier = new CyclicBarrier(NUM_THREADS, new UpdateState());

private class UpdateState implements Runnable 
    @Override
    public void run() 
        for (int i = 0; i < NUM_THREADS; ++i) 
            if (availability[i]) 
                // Update condition for "i'th" thread to run
                break;
            
        
    


public long write() throws IOException 
   waitForTurn();


private void waitForTurn() 
   while (!canSchedule()) 
       try 
          barrier.await();
         catch (InterruptedException e) 
          // Assert fail
         catch (BrokenBarrierException e) 
          // Assert fail
       
   


private boolean canSchedule() 
   return // some state checks;


public static void main(String[] args) 

   ExecutorService executorService = Executors.newFixedThreadPool(2);
   for (int i = 0; i < NUM_THREADS; ++i) 
     Future<Long> responseFuture = executorService.submit(new Task(...));
     responses.add(responseFuture);
   

   executorService.shutdown();
   executorService.awaitTermination(5, TimeUnit.SECONDS);

   // Check futures
              

现在说 task1,调用 write() 5 次,task2 调用 write 500 次..然后 task1 将在遇到障碍 5 次后终止,但 task2 将继续运行。

【问题讨论】:

“旅行”是什么意思?另外,能否给出相关代码? y线程如何在不触发屏障的情况下成功终止? 屏障被触发,请看示例代码。 【参考方案1】:

要真正使用 CyclicBarrier,所有线程必须在屏障上 await 才能成功触发它。你的说法让我很困惑

在这些“x”线程中,“y”的生命周期非常短并终止 成功完成执行后很快。

如果“y”个线程/任务完成得非常快,为什么它们不在屏障上等待?如果所有“y”个线程在完成时都在屏障上等待,那么其余线程 (x-y) 将很快等待并触发屏障。

【讨论】:

以上是关于CyclicBarrier:导致屏障跳闸“y”的“x”个线程完成它们的执行并终止的主要内容,如果未能解决你的问题,请参考以下文章

当通过的线程数量小于屏障限制时,屏障(例如 CyclicBarrier)是不是会导致死锁?

java CyclicBarrier同步屏障

CyclicBarrier循环屏障相关

Java并发工具类同步屏障CyclicBarrier

AQS同步组件-CyclicBarrier(循环屏障)解析和用例

Java并发多线程编程——CyclicBarrier