作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从主线程运行一个线程列表,其中一个线程(我们称之为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
方法仅在线程终止后才与该线程连接。处于 WAITING 状态的线程不会终止。
所以直接的答案是你不能加入等待线程。
但另一方面,Thread::join
不会执行繁忙等待。
要注意的第三件事是依赖线程的状态来指示某些内容是相当粗糙的。如果线程处于等待状态,则表明它正在等待某个互斥锁的通知。它不会告诉您它正在使用哪个互斥锁。
现在...大概...您希望当其他线程达到特定状态时唤醒您的 tLast
线程。如果这就是您想要实现的目标,您可能需要 CountdownLatch
、Semaphore
或 CyclicBarrier
。
关于java - 在java中,有没有办法在线程进入等待状态而不是完成时将其设为 "Join"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59433110/
由“CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", ES_MULTILINE.."创建的文本框需要\r\n 换行。我将我的 stdoutput 重定向到那个文
我是一名优秀的程序员,十分优秀!