Вы можете сделать это, используя несколько способов.
Например, присоединение :
Поток может присоединиться к другому потоку, что означает, что он ожидает, пока другой поток заканчивается. Поток 2 и 3 могут присоединиться к потоку 1, а поток 4 может присоединиться к потоку 2 и 3.
Другая возможность - await и сигнал , но я не уверен, что она соответствует вашим требованиям (она использует что-то аналогично Thread.sleep()
:
Сначала вы создаете общий java.util.concurrent.locks.Lock
и создаете условие этого замка с помощью .newCondition()
Вы также создаете второе условие с помощью newCondition()
.
Блокировка должна быть заблокирована перед вызовом await
и signal
/ signalAll
.
Поток 2 и 3 вызывает .await()
при первом условии, а Поток 1 вызывает .signalAll
на первом условие, когда он завершается.
Поток 4 вызывает .await()
для второго условия перед его началом.
Поток (либо 2, либо 3), который заканчивается последним (logi c, который Поток Первое завершение должно быть синхронизировано с блокировкой) вызовы .signal()
при втором условии.
Потоки также могут запускать друг друга :
Поток 1 запускает поток 2 и 3 после того, как его задача заканчивается, но я бы рекомендовал и один из других механизмов для потока 4.
[ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ]
Возможно, вы не сможете напрямую взаимодействовать с потоками, если используете ExecutorService
, Эта публикация может помочь вам присоединиться, ожидание / сигнал не должны быть более сложными, и потоки могут также запланировать задачу для пула потоков, если это необходимо.