2.yield和sleep

134 阅读1分钟
package org.copico.study.thread;


import java.util.concurrent.TimeUnit;

import static java.lang.Thread.State.TERMINATED;

/**
 * sleep
 * 1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
 * 2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
 * 3. 睡眠结束后的线程未必会立刻得到执行
 * 4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性
 * yield
 * 1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
 * 2. 具体的实现依赖于操作系统的任务调度器
 */
public class Thread02YieldAndSleep {

    public static void main(String[] args) throws InterruptedException {
        testSleepTread();
        testYield();
    }

    private static void testYield() {
        Thread yieldThread = new Thread(Thread::yield);
        System.out.println("yieldThread线程状态=" + yieldThread.getState());
        yieldThread.start();
        while (true) {
            Thread.State state = yieldThread.getState();
            System.out.println("yieldThread线程状态=" + state);
            if (state == TERMINATED)
                return;
        }
    }

    private static void testSleepTread() throws InterruptedException {
        Thread sleepThread = new Thread(() -> {
            try {
                System.out.println("sleep开始");
                TimeUnit.SECONDS.sleep(3);
                System.out.println("sleep结束");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println("sleepThread线程状态=" + sleepThread.getState());
        sleepThread.start();
        System.out.println("sleepThread线程状态=" + sleepThread.getState());
        while (true) {
            Thread.State state = sleepThread.getState();
            System.out.println("sleepThread线程状态=" + state);
            if (state == TERMINATED)
                return;
            TimeUnit.SECONDS.sleep(1);
        }
    }

}