【问题标题】:CyclicBarrier: Of 'x' threads that cause the barrier to trip 'y' complete their execution and terminateCyclicBarrier:导致屏障跳闸“y”的“x”个线程完成它们的执行并终止
【发布时间】: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线程如何在不触发屏障的情况下成功终止?
  • 屏障被触发,请看示例代码。

标签: java multithreading concurrency barrier cyclicbarrier


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 2018-12-20
    • 2014-07-30
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多