在 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 线程在其他线程达到特定状态时唤醒。如果这是您想要实现的目标,CountdownLatchSemaphoreCyclicBarrier 可能就是您所需要的。