Синхронизация Java: несколько CountDownLatch - PullRequest
0 голосов
/ 15 мая 2019

Следующая ситуация: Поток A запускает поток B и должен ждать, пока поток B не выполнит свою работу. Поток B может начать новую Поток C. Если это так, Поток A должен ожидать Поток B и Поток C.

Я мог бы реализовать это, используя два CountDownLatch, но мне интересно, есть ли лучшее решение. Я посмотрел на CyclicBarrier и Phaser, но я не думаю, что они подходят в моем случае.

1 Ответ

0 голосов
/ 15 мая 2019

Вы можете использовать Thread.join

final Thread c = new Thread(() -> {doSomethingInThreadC()});
c.start();
final Thread b = new Thread(() -> {
  doSomethingInThreadB_I();
  c.join(); // wait until thread C is completed
  doSomethingInThreadB_II();
});
b.start();
Thread a = new Thread(() -> {
  doSomethingInThreadA_I();
  b.join(); // wait until thread B is completed
  doSomethingInThreadA_II();
});
s.start();

Однако этот подход имеет некоторые ограничения - он ожидает, пока поток не будет остановлен (а не до тех пор, пока какое-либо действие не будет завершено).Если потоки B и C являются объединенными потоками, они никогда не прекратятся.

Если вы ищете работу, то используйте wait/notify

...