1

我有一个 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 将继续运行。

4

1 回答 1

2

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

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

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

于 2014-03-31T21:53:08.187 回答