关于sleep()的执行顺序

来源:5-4 遇到阻塞

hanxuanliang

2019-10-03

public class WithSleep {
    public static void main(String[] args) throws InterruptedException {
        Runnable runnable = () -> {
          int num = 0;
          System.out.println("begin");
            try {
              while (num <= 10000) {
                  if (num % 100 == 0) System.out.println(num);
                  num++;
                  Thread.sleep(10);		// 1
              }
            } catch (InterruptedException e) {
                  e.printStackTrace();
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
        System.out.println(Thread.currentThread().getName());
        Thread.sleep(5000);		// 2
        thread.interrupt();
    }
}

执行情况

main
begin
0
100
200
300
400
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.hanxunliang.stopthreads.WithSleep.lambda$main$0(WithSleep.java:19)
	at java.lang.Thread.run(Thread.java:748)

老师,我有两个问题:

  • start() 在打印语句之前执行,为什么打印语句却在先执行?
  • 当运行1处 sleep() 和 2处 sleep() 的执行情况是怎样的?
写回答

1回答

悟空

2019-10-04

  1. 你指的是main、begin这两句对吧,因为begin是在子线程,而创建并开始线程需要时间,相反,main是在主线程打印的,在执行了thread.start();之后会立刻打印main,所以main在begin之前。

  2. 两处sleep的效果相同,都是让线程暂停,不过根据执行位置的不同,一个是子线程暂停,一个是主线程暂停。

0
8
悟空
回复
小布鲁斯韦恩
恩是的
2020-04-25
共8条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程