【问题标题】:Thread.yield and sleepThread.yield 和睡眠
【发布时间】:2014-07-02 17:03:00
【问题描述】:

我是多线程的新手,我遇到了两个关于线程调度的问题 thread.yield 和 sleep 我无法从我的书或谷歌搜索中找到明确的答案。我将保存所有伪代码或真实代码,因为如果我的假设不正确,我认为我已经理解了可能的饥饿问题。

我将在我的问题中引用 3 个伪线程:

  1. 我的第一个问题是,如果我在 3 个线程中的一个线程中调用线程 yield 或 sleep,是否可以保证 CPU 在返回调用 yield 的线程之前尝试调度和处理其他 2 个线程?所以基本上是一个明确的队列中的线程,这使得屈服线程进入队列的最后一个?

我知道 yield 应该让其他线程有机会运行,但是是否有可能,例如,在产生线程之后,其他 2 个线程之一尝试运行,然后它返回到调用 yield 的原始线程,跳过最后一个线程,根本不给它运行的机会?

  1. 我的第二个问题与第一个有关。那么 yield 和 sleep 是否都具有相同的属性,即它们在被调用时都将成为队列中的最后一个,就像我在第一个问题中假设的那样,或者它们之间除了睡眠时间之外还有其他区别吗?

如果这些问题没有意义,我的代码中可能存在的问题是,在进入睡眠状态的线程之前,它已经解锁了一个互斥锁,其他线程之一之前尝试过锁定,失败并等待它打开.那么在线程进入睡眠状态后,是否保证试图锁定互斥体的线程会在睡眠线程之前锁定它?

【问题讨论】:

    标签: multithreading sleep yield


    【解决方案1】:

    Thread.yield() 是对线程调度程序的提示,意思是“嘿,现在我感觉很好,如果你让我让其他线程运行的话”。没有保证,它只是一个提示。关于“队列”中线程顺序的假设也是不正确的,因为线程调度也是由操作系统完成的,如果没有额外的线程交互机制,很难预测特定的执行顺序。

    Thread.sleep() 让当前线程休眠一段指定的时间,所以第二个问题的答案是 - 不,它们做不同的事情。

    【讨论】:

    • 好的,谢谢,我想我现在明白了。我想我只是感到困惑,因为我看到了被称为:线程在一个“队列”中,这不是真的。
    • @TinkersPot 不客气。如果它解决了您的问题,请不要忘记接受答案。
    • Thread.yield() 不允许调度程序“休眠”调用线程。它允许调度程序将线程移动到运行队列的后面。 Thread.sleep() 将调用者的状态从 RUNNABLE 更改为 TIMED_WAITING。 Thread.yield() 根本不改变线程的状态。状态在调用之前、期间和之后都是 RUNNABLE。
    猜你喜欢
    • 1970-01-01
    • 2012-04-07
    • 2018-08-09
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多