在Java中,有一种方法可以在线程进入等待状态后而不是在完成时“加入”它?

问题描述 投票:0回答:1

我正在尝试从主线程运行线程列表,其中一个线程(我们称其为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进行空闲迭代,但是无论哪种方式,这都是一个繁忙的等待。

java multithreading concurrency wait
1个回答
0
投票

join方法仅在终止后才与线程一起加入。处于等待状态的线程不会终止。

所以直接的答案是您不能加入等待的线程。

但是,另一方面,Thread::join并不忙于等待。

要注意的第三件事是,依靠线程的状态来指示某些东西是很粗糙的。如果线程处于WAITING状态,则表明您正在等待某个互斥锁上的notify。它不会告诉您正在使用哪个互斥锁。

现在...大概...您希望其他线程达到特定状态时唤醒tLast线程。如果这是您要实现的目标,则可能需要CountdownLatchSemaphoreCyclicBarrier

© www.soinside.com 2019 - 2024. All rights reserved.