Можно ли использовать статическую защелку или семафор?

У меня есть несколько классов, которые реализуют интерфейс Runnable. Каждый из них выполняется через отдельный SingleThreadExecutor. Я не могу изменить подпрограмму выполнения, я могу просто предоставить разные Runnables для нее.

Мне нужно сделать некоторые операции с Runnables в зависимости от других результатов Runnables. Т.е. я хочу выполнить некоторую операцию внутри метода run() только в том случае, если все другие Runnables достигли этой точки выполнения. Или я хочу запустить некоторую подпрограмму внутри метода run() только в том случае, если число Runnables, которые делают то же самое, меньше 10.

Единственное решение, которое я вижу, - создать статические переменные CountDownLatch и Semaphore для синхронизации.

Я реализовал это, но по некоторым неизвестным причинам, начиная с некоторого Runnable SingleThreadExecutor не запускает поток со следующим Runnable, если некоторые Runnables ожидают Latch или Semaphore. Например 7 Runnables запускаются, другие нет.

Мой вопрос: правильна ли моя схема синхронизации на статическом Latch или Semaphore?

1 ответ

CyclicBarrier как правило, более полезно, чем CountDownLatch в случаях, когда:

  1. многопоточная операция происходит поэтапно или итерациями, и;
  2. между этапами / итерациями требуется однопоточная операция, например, для объединения результатов предыдущей многопоточной части.

Больше информации здесь. Пример здесь

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