【问题标题】:In java, is there a way to "Join" a thread after it went to a waiting state instead of when it's done?在java中,有没有办法在线程进入等待状态而不是完成后“加入”线程?
【发布时间】:2020-04-13 10:21:09
【问题描述】:

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

【问题讨论】:

  • 您可能正在寻找CountDownLatch
  • 标记前请阅读标记信息。并非所有库例程都有标签。请通过单击标记选项来标记以查看信息并避免拼写错误。
  • 当你的线程到达等待状态时,是否可以让你的线程 notify() 一个对象?
  • 我真的不明白你为什么想要这样,但如果你的线程处于等待状态,我希望它在等待某个对象,无论是定时等待还是正常等待,你可以调用 latch.countDown(); on每个线程然后调用 latch.await();在调用 tLast.start() 之前

标签: java multithreading concurrency wait


【解决方案1】:

join 方法只会在线程终止后加入线程。处于 WAITING 状态的线程未终止。

所以直接回答是不能加入等待线程。

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

要注意的第三件事是,依靠线程的状态来指示某事是相当粗糙的。如果一个线程是WAITING 状态,这告诉你它正在等待某个互斥锁上的notify。它不会告诉你它正在使用哪个互斥锁。

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

【讨论】:

  • 我记得我最后确实使用了CountdownLatch,所以这个答案很有帮助。这不完全是我需要的,但如果你把倒计时放在代码的右边,它就足够接近了。
  • 意思是,在你想让线程进入睡眠状态之前,你让它倒计时,让等待闩锁的另一个线程继续,这样你就可以确保第一个线程有任何东西to do before go to sleep 完成后,第二个线程将等待它完成。
  • 嗯,是的。不幸的是,您的问题没有向我们展示足够的背景来确定您实际在做什么。当您没有被告知问题是什么时,很难提出正确的解决方案。这就是为什么我们无法为您提供您所需要的确切信息。 (如果您阅读了我回答的最后一段,您会发现我不得不猜测您的问题的性质......以便对可能有帮助的课程提出一些模糊的建议。)
  • 注意,下次我会尽量提供更多信息。我确实希望这个线程可能对其他人有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
相关资源
最近更新 更多