字面意思理解:
sleep 睡眠,睡觉
yield 让步,让路
sleep() 和 yield() 是 Thread 类中的两个静态方法
sleep()
作用: 使当前线程进入睡眠状态,让出 CPU 的执行权,不释放持有的锁。
语法: static void sleep(long millis) 或 static void sleep(long millis, int nanos)
参数:
millis:睡眠时间的毫秒数。
nanos:睡眠时间的纳秒部分,范围是 0 到 999999。
异常: InterruptedException - 如果任何线程中断了当前线程。
sleep() 适用于需要让线程睡眠一段时间的情况,例如定时任务、延时执行等
try {
// 睡眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
yield() 基本不怎么用
作用: 暂停当前正在执行的线程对象,并执行其他线程。它只是将线程从运行状态转为就绪状态,让系统重新调度。
语法: static void yield()
注意: yield() 方法不会释放锁,仅仅是让出 CPU 的执行权,使得线程重新处于就绪状态,等待系统重新调度。
package com.jdw.java8.thread;
public class YieldExample {
private static int T1_COUNT = 0;
private static int T2_COUNT = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
// 加锁,保证 T1_COUNT 的原子性
synchronized (YieldExample.class) {
T1_COUNT++;
}
// yield方法释放了CPU的执行权,但是依然保留了CPU的执行资格,给其它线程一个重新争抢的机会
Thread.yield();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
// 加锁,保证 T2_COUNT 的原子性
synchronized (YieldExample.class) {
T2_COUNT++;
}
}
});
t1.start();
t2.start();
// 关键是我们不要t1.join(),因为出让执行权。只阻塞t2线程,看相同时间内,t1和t2执行次数
t2.join();
System.out.println("t1 == :" + T1_COUNT); // 256
System.out.println("t2 == :" + T2_COUNT); // 10000
}
}