CyclicBarrier: потоки 'x', вызывающие отключение барьера 'y', завершают свое выполнение и завершают работу

У меня есть CyclicBarrier, который будет отключаться, когда на нем ожидают число "х" сторон (потоков). Среди этих "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 раз. После этого задача 1 прекратит работу после 5-кратного попадания в барьер, но задача2 продолжит работу.

1 ответ

Чтобы действительно использовать CyclicBarrier, ВСЕ потоки должны await на барьере, чтобы успешно споткнуться. Ваше утверждение смущает меня

Среди этих "x" потоков у "y" очень малый срок службы, и они заканчиваются очень быстро после успешного завершения их выполнения.

Если нити / задачи 'y' завершаются очень быстро, почему они не ждут на барьере? Если у вас есть все нити 'y', ожидающие на барьере, когда они завершатся, тогда остальные нити (xy) скоро будут ждать и отключить барьер.

Другие вопросы по тегам