我正在尝试从主线程运行线程列表,其中一个线程(我们称其为tLast
)应在其他线程进入等待状态后分别启动。我知道t.join
,但据我了解,它仅在线程完成工作后才起作用,并且据我了解,等待并不重要。到目前为止,除了tLast
:
boolean inSleepState = false;
while(!inSleepState){
inSleepState = true;
for(Thread thread: threads){
if(thread.checkState != Thread.state.WAITING){
inSleepState = false;
break;
}
}
}
tLast.start()
我看到的主要问题是这是一个忙碌的等待,据我所知这是一种不好的做法,而且建议不正确,但是我想不出另一种方法来做到这一点。顺便说一句,我意识到我可以分别等待每个线程并通过threads
进行空闲迭代,但是无论哪种方式,这都是一个繁忙的等待。
join
方法仅在终止后才与线程一起加入。处于等待状态的线程不会终止。
所以直接的答案是您不能加入等待的线程。
但是,另一方面,Thread::join
并不忙于等待。
要注意的第三件事是,依靠线程的状态来指示某些东西是很粗糙的。如果线程处于WAITING
状态,则表明您正在等待某个互斥锁上的notify
。它不会告诉您正在使用哪个互斥锁。
现在...大概...您希望其他线程达到特定状态时唤醒tLast
线程。如果这是您要实现的目标,则可能需要CountdownLatch
,Semaphore
或CyclicBarrier
。