两个方法Thread#run
and Thread#wakeup
在某种程度上是不同的,但我不清楚。有人能提供一对差异最小的代码(即,差异只是在一个中使用run
,在另一个中使用wakeup
),显示不同的结果,并可能对此进行解释吗?
Edit正如卡里所指出的,它确实是this question的复制品,而且那里有一个很好的答案,但是现在我不确定线程被唤醒但不运行意味着什么,这与线程处于睡眠状态有什么不同?
两个方法Thread#run
and Thread#wakeup
在某种程度上是不同的,但我不清楚。有人能提供一对差异最小的代码(即,差异只是在一个中使用run
,在另一个中使用wakeup
),显示不同的结果,并可能对此进行解释吗?
Edit正如卡里所指出的,它确实是this question的复制品,而且那里有一个很好的答案,但是现在我不确定线程被唤醒但不运行意味着什么,这与线程处于睡眠状态有什么不同?
2条答案
按热度按时间iqxoj9l91#
回答你的第二个问题,你不能调度一个休眠线程,但是当一个线程被唤醒时,你可以调度它运行,即使它当前没有运行。
根据我对wakeup与run的理解,第一部分要补充的是,run在它内部调用wakeup,然后在它上面调用run。
希望能有所帮助。
ohfgkhjo2#
唤醒线程但不运行意味着什么
这意味着线程现在是“可运行的”,这表明线程有工作要做(即它不再等待,也没有终止),因此线程调度器知道下次决定恢复哪个线程时要考虑这个线程。另一方面,
Thread#run
不会让调度器做出选择,而是让目标线程立即运行。在MRI/YARV上,由于GVL和线程不被抢占的事实,您不会看到使用
Thread#wakeup
恢复的线程执行,直到当前运行的线程(调用#wakeup
的线程)通过、休眠或运行到I/O等待。