CyclicBarrier:' x'导致障碍物跳闸的线程' y'完成他们的执行并终止

时间:2014-03-31 19:29:05

标签: java multithreading concurrency barrier cyclicbarrier

我有一个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调用500次写入。然后task1将在触及屏障5次后终止,但task2将继续运行。

1 个答案:

答案 0 :(得分:1)

要真正使用CyclicBarrier所有线程必须await在屏障上才能成功跳闸。你的陈述使我感到困惑

  

其中&#39; x&#39;线程&#39; y&#39;寿命很短并且终止   成功完成执行后很快就会很快。

如果&#39; y&#39;线程/任务很快完成,他们为什么不等待障碍?如果你有所有&#39; y&#39;线程在完成时在屏障上等待,然后其余线程(x-y)将很快等待并跳闸。