Sleep和yield

120 阅读1分钟

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());

    }
}

image.png 可以看到,首先线程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();
    }
}

image.png 关于线程的sleep和interrupte更详细的在文章juejin.cn/post/704028… 中有介绍。

  • 睡眠结束后的线程未必立马得到执行

yield

  • 调用yield会让当前线程从running进入runnable(就绪)状态,调度同等优先级的其他线程执行。如果此时没有同优先级的其他线程,不能保证当前线程的暂停效果

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