Sleep
- 调用sleep会让当前线程从RUNNABLE进入TIME_WAITING(阻塞)状态
@Slf4j
public class TestStartAndYield {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(){
@Override
public void run(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t1.start();
log.debug("state of t1:{}",t1.getState());
Thread.sleep(500);
log.debug("state of t1:{}",t1.getState());
}
}
可以看到,首先线程t1执行,此时状态是
RUNNABLE
(java中线程的就绪态和运行态都是RUNNABLE);让线程休眠5s,并且主线程休眠0.5s后再次获取线程t1的状态,此时变为TIME_WAITING
。
- 其他线程可以调用interupt方法打断正在睡眠的线程,此时睡眠的线程会抛出InterruptedException异常
@Slf4j
public class TestStartAndYield {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(){
@Override
public void run(){
try {
log.debug("start sleeping...");
Thread.sleep(2000);
} catch (InterruptedException e) {
log.debug("t1 is interrupted...");
e.printStackTrace();
}
}
};
t1.start();
Thread.sleep(500);
log.debug("interrupt...");
t1.interrupt();
}
}
关于线程的sleep和interrupte更详细的在文章juejin.cn/post/704028… 中有介绍。
- 睡眠结束后的线程未必立马得到执行
yield
-
调用yield会让当前线程从
running
进入runnable
(就绪)状态,调度同等优先级的其他线程执行。如果此时没有同优先级的其他线程,不能保证当前线程的暂停效果 -
具体实现依赖于操作系统的任务调度器