Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,是否有一种方法;加入;线程进入等待状态后,而不是在';结束了吗?_Java_Multithreading_Concurrency_Wait - Fatal编程技术网

在java中,是否有一种方法;加入;线程进入等待状态后,而不是在';结束了吗?

在java中,是否有一种方法;加入;线程进入等待状态后,而不是在';结束了吗?,java,multithreading,concurrency,wait,Java,Multithreading,Concurrency,Wait,我试图从一个main运行一个线程列表,其中一个线程(我们称之为tLast)应该在其他线程进入等待状态后单独启动。我知道t.join,但据我所知,只有当线程完成它的工作时,它才会工作,而据我所知,等待并不重要。 到目前为止,在启动所有线程后,我尝试了这个方法,但是tLast: boolean inSleepState = false; while(!inSleepState){ inSleepState = true; for(Thread thread: threads){

我试图从一个main运行一个线程列表,其中一个线程(我们称之为
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()

我看到的主要问题是,这是一个繁忙的等待,据我所知,这是一个糟糕的做法,也没有得到应有的建议,但我想不出其他方法来做到这一点。顺便说一句,我意识到我可以单独等待每个线程,并在
线程上节省迭代时间,但无论哪种方式,这都是一个繁忙的等待。

join
方法只会在线程终止后与线程连接。处于等待状态的线程未终止

所以直接的答案是你不能加入一个等待的线程

但另一方面,
Thread::join
不会进行繁忙的等待

需要注意的第三点是,依赖线程的状态来指示某些内容是相当粗糙的。如果线程处于
等待
状态,则表明它正在等待某个互斥体上的
通知
。它不会告诉您它正在使用哪个互斥体


现在。。。大概您希望在其他线程达到特定状态时唤醒
tLast
线程。如果您正试图实现这一目标,则您可能需要一个
倒计时闩锁
信号灯
自行车载货车

您可能正在寻找一个
倒计时闩锁
。请在标记前阅读标记信息。并非所有库例程都有标记。请单击标记选项进行标记,以查看信息并避免输入错误。当线程达到等待状态时,是否可以让线程通知()对象?我不太明白为什么您会希望这样,但如果线程处于等待状态,我希望它正在等待某个对象,无论是定时等待还是正常等待,您可以调用每个线程,然后调用latch.await();我记得在调用tLast.start()之前,我最后使用了一个
CountdownLatch
,所以这个答案很有用。这并不完全是我所需要的,但是如果你在代码中把倒计时放在正确的位置,它就足够接近了。也就是说,在你想让线程进入睡眠之前,你让它倒计时,让另一个等待闩锁的线程继续,这样你就可以确保第一个线程在进入睡眠之前必须做的任何事情都完成了,第二个线程将等待它完成。是的。不幸的是,你的问题没有向我们展示足够的背景来确定你实际上在做什么。当你没有被告知问题所在时,很难给出正确的解决方案。这就是为什么我们不能给你你所需要的。(若你们读了我答案的最后一段,你们会发现我不得不猜测你们问题的性质……以便对可能有用的课程提出一些模糊的建议。)注意,下次我会尽量提供更多信息。我真的希望这篇文章能对其他人有所帮助。