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)是不是会导致死锁?