多线程 Thread.yield 方法到底有什么用?

2 个回答

  • 齐昊
    垆边人似月,皓腕凝霜雪。
    ### `Thread` 类中的 `yield` 方法的作用 #### 作用 `yield` 方法是 `Thread` 类中的一个静态方法,用于让当前正在执行的线程主动放弃对 CPU 的占用,让其它具有相同优先级的线程有机会执行。 #### 具体行为 - **暂停当前线程**:`yield` 方法会让当前线程从运行状态转变为可运行状态,让操作系统的线程调度器重新调度。 - **相同优先级**:它会尝试让同等优先级的线程获得 CPU 时间片,但并不保证会成功。 - **无保证**:调用 `yield` 方法后,当前线程有可能被重新调度立即继续执行。 #### 特点 1. **静态方法**:`yield` 是一个静态方法,可以通过 `Thread.yield()` 调用,不依赖于实例。 2. **不保证让出 CPU**:虽然调用 `yield` 方法会让当前线程主动放弃 CPU,但无法保证其它线程会立即获得 CPU 使用权。当前线程有可能在进入暂停状态后马上又被调度执行。 3. **优先级相同**:通常情况下,`yield` 方法会让出 CPU 给与当前线程优先级相同的线程,但这也依赖于操作系统的线程调度策略。 #### 示例代码 以下是一个简单的代码示例,演示了 `yield` 方法的使用: ```java public class YieldExample { public static void main(String[] args) { Thread producer = new Thread(new Producer(), "Producer"); Thread consumer = new Thread(new Consumer(), "Consumer"); producer.setPriority(Thread.MIN_PRIORITY); // 最低优先级 consumer.setPriority(Thread.MAX_PRIORITY); // 最高优先级 producer.start(); consumer.start(); } } class Producer implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " producing: " + i); Thread.yield(); // 让出CPU } } } class Consumer implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " consuming: " + i); Thread.yield(); // 让出CPU } } } ``` ### 总结 - `yield` 方法用于让当前线程主动放弃 CPU,使其他具有相同优先级的线程有机会执行。 - `yield` 是一个静态方法,通过 `Thread.yield()` 调用。 - 调用 `yield` 后,当前线程有可能立即重新被调度执行,不能保证其它线程一定能获得 CPU 使用权。 - `yield` 方法依赖于操作系统的线程调度机制,不同的操作系统实现可能会有不同的效果。 通过理解 `yield` 方法的作用和特点,可以在编写多线程程序时更好地控制线程的执行顺序和资源的分配,尽可能提高程序的性能和响应能力。
    发布于 2024-06-01 19:01 •IP属地 上海
    举报
    评论
    收藏

  • 澜夜师兄
    勇敢一点吧!我们不会比今年更年轻了。
    yield 即 “谦让”,也是 Thread 类的方法。它让掉当前线程 CPU 的时间片,使正在运行中的线程重新变成就绪状态,并重新竞争 CPU 的调度权。它可能会获取到,也有可能被其他线程获取到。 ### yield 和 sleep 的异同 1)yield, sleep 都能暂停当前线程,sleep 可以指定具体休眠的时间,而 yield 则依赖 CPU 的时间片划分。 2)yield, sleep 两个在暂停过程中,如已经持有锁,则都不会释放锁资源。 3)yield 不能被中断,而 sleep 则可以接受中断。 如果一定要用它的话,一句话解释就是:yield 方法可以很好的控制多线程,如执行某项复杂的任务时,如果担心占用资源过多,可以在完成某个重要的工作后使用 yield 方法让掉当前 CPU 的调度权,等下次获取到再继续执行,这样不但能完成自己的重要工作,也能给其他线程一些运行的机会,避免一个线程长时间占有 CPU 资源。
    发布于 2022-02-28 14:43 •IP属地 天津
    举报
    评论
    收藏