sleep

1. 调用 sleep 会让当前线程从 Running进入 Timed Waiting 状态(阻塞)

2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException

3. 睡眠结束后的线程未必会立刻得到执行

4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性

sleep应用:限制对 CPU 的使用

在没有利用 cpu 来计算时,不要让 while(true) 空转浪费 cpu,这时可以使用 yield 或 sleep 来让出 cpu 的使用权给其他程序

sleep实现
while(true) {
 try {
 Thread.sleep(50);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
}
  • 可以用 wait 或条件变量达到类似的效果
  • 不同的是,后两种都需要加锁,并且需要相应的唤醒操作,一般适用于要进行同步的场景
  • sleep 适用于无需锁同步的场景
wait 实现
synchronized(锁对象) {
 while(条件不满足) { 
 try {
 锁对象.wait();
 } catch(InterruptedException e) {
 e.printStackTrace();
 }
 }
 // do sth...
}
条件变量实现
lock.lock();
try {
 while(条件不满足) {
 try {
 条件变量.await();
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 // do sth...
} finally {
 lock.unlock();
}


yield

1. 调用 yield 会让当前线程从 Running 进入 Runnable就绪状态,然后调度执行其它线程

2. 具体的实现依赖于操作系统的任务调度器