在 java 中,有没有办法 "Join" 线程进入等待状态后而不是完成时?
In java, is there a way to "Join" a thread after it went to a waiting state instead of when it's done?
我正在尝试 运行 主线程列表,其中一个线程,我们称之为 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
方法仅在线程终止后才与线程连接。处于 WAITING 状态的线程未终止。
所以直接的答案是你不能加入等待线程。
但另一方面,Thread::join
不会忙等待。
第三点要注意的是,依靠线程的状态来指示某些东西是相当粗糙的。如果线程处于 WAITING
状态,则表示它正在等待某个互斥体上的 notify
。它不会告诉您它正在使用哪个互斥量。
现在...大概...您希望您的 tLast
线程在其他线程达到特定状态时唤醒。如果这是您想要实现的目标,CountdownLatch
、Semaphore
或 CyclicBarrier
可能就是您所需要的。
我正在尝试 运行 主线程列表,其中一个线程,我们称之为 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
方法仅在线程终止后才与线程连接。处于 WAITING 状态的线程未终止。
所以直接的答案是你不能加入等待线程。
但另一方面,Thread::join
不会忙等待。
第三点要注意的是,依靠线程的状态来指示某些东西是相当粗糙的。如果线程处于 WAITING
状态,则表示它正在等待某个互斥体上的 notify
。它不会告诉您它正在使用哪个互斥量。
现在...大概...您希望您的 tLast
线程在其他线程达到特定状态时唤醒。如果这是您想要实现的目标,CountdownLatch
、Semaphore
或 CyclicBarrier
可能就是您所需要的。