Можно ли использовать статическую защелку или семафор?
У меня есть несколько классов, которые реализуют интерфейс 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
в случаях, когда:
- многопоточная операция происходит поэтапно или итерациями, и;
- между этапами / итерациями требуется однопоточная операция, например, для объединения результатов предыдущей многопоточной части.