请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于sleep()的执行顺序

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() 的执行情况是怎样的?

正在回答 回答被采纳积分+3

1回答

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 hanxuanliang #1
    1. 创建线程是交给JVM,需要时间,然后主线程继续执行(没有阻塞)。这个理解对吗,老师。
    2. 还有一点不懂:子线程sleep时(10ms),主线程也在sleep(5000ms),两个线程是互不干扰的吧(我开始以为子线程sleep,会调度到主线程执行)。老师,我这个理解有问题吗?
    回复 有任何疑惑可以回复我~ 2019-10-04 10:19:28
  • 悟空 回复 提问者 hanxuanliang #2
    1. 理解是对的。
    2. 两个线程是互不干扰的,可以同时sleep,sleep期间不占用CPU。子线程sleep,并不代表主线程就在执行。
    回复 有任何疑惑可以回复我~ 2019-10-04 10:28:29
  • 提问者 hanxuanliang 回复 悟空 #3
    那是不是说,在这个程序里面,子线程sleep时,主线程也在sleep,整个程序都被阻塞,什么都没干,只等时间再被唤醒
    回复 有任何疑惑可以回复我~ 2019-10-04 10:35:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信