一个线程能否调用两次start()方法?

    欢迎大家搜索“小猴子的技术笔记”关注我的公众号,领取丰富面试资料和学习资料。

    公众号回复“电子书”领取超多、超全电子书籍。

    公众号回复“分布式”领取分布式学习视频。

    我写了一个免费的图片压缩工具:“http://images.houry.top/index” 欢迎大家使用。

    我写了一个netty弹幕系统:“http://bullet-screen.houry.top:8080/index“

    关于线程我的笔记中有专门的一栏在进行讲解,因此关于线程的一些概念今天在这里也就不过多进行阐述了。那么一个线程能够调用两次“start()”方法吗?如果调用了会发生什么呢?这个问题的考点又是什么呢?
    我们都知道构建一个线程可以先实现“Runnable”接口,然后用“Thread”类进行构造一个线程,就如下面这样的简单例子:

public class TwoStartTest implements Runnable {
    @Override
    public void run() {
        System.out.println("只调用了一次start方法");
    }
    
    public static void main(String[] args) {
        Thread thread = new Thread(new TwoStartTest());
        thread.start();
    }
}
只调用了一次start方法

    运行程序之后发现程序能够正常输出。那如果将上面的程序进行修改调用两次"start()"之后再次运行会有什么结果呢?

public class TwoStartTest implements Runnable {
    @Override
    public void run() {
        System.out.println("调用了两次start方法");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new TwoStartTest());
        thread.start();
        thread.start();
    }
}
Exception in thread "main" java.lang.IllegalThreadStateException
  at java.lang.Thread.start(Thread.java:708)
  at com.monkeybrother.thread.atomic.TwoStartTest.main(TwoStartTest.java:17)
调用了两次start方法

    我们可以看到程序抛出了异常,但是也打印出了“调用了两次start方法”这个输出语句。由此可知,如果重复调用“start()”方法,只会执行一次重写过的“run()”方法中的代码逻辑并且会抛出“IllegalThreadStateException”这个异常。

    我们还可以跟进源码可以看到文档的注释:如果线程已经启动过了,再次启动也就会抛出“IllegalThreadStateException”这个异常。
一个线程能否调用两次start()方法?_第1张图片
    也许你早就已经知道了这个问题的答案,那么面试官真正想考察的究竟是什么呢?如果你仅仅会回答出来会抛出异常那么说明你的基础还行,但是如果你结合线程的生命周期来进行描述的话,那么会让面试官眼前一亮!
    如果你熟悉线程的命周期我想就应该会有所了解,线程一共可以经过6个不同状态的生命周期。

public enum State {
    // 线程还没有被启动的时候的状态
    NEW,
    // 表示调用了“start()”方法,这里还可以细分为“ready”和“running”状态
    RUNNABLE,
    // 线程等待进入到synchronized方法或者等待进入synchronized块
    BLOCKED,
    // 表示线程进入等待状态,比如调用了“wait()”、“join()”等
    WAITING,
    // 带有超时时间的
    TIMED_WAITING,
    // 线程正常结束,或者强制停止,或者遇到异常终止之后的状态
    TERMINATED;
}

    关于生命周期的具体详解,大家可以参考我之前写的一篇文章线程的生命周期。这里可以再简单回顾一下生命周期的图:

一个线程能否调用两次start()方法?_第2张图片
    可以看到,只有处于NEW状态的线程才能够执行“start()”方法。也就是第二次调用“start()”方法的时候,线程可能终止或者其他非NEW的状态,因此无论如何都是不能够重复调用的。

    面试官想考你这个问题的本质也就是想了解你对线程的生命周期和状态转义有没有一个很好的个人认知,而不是单纯的背诵面试题。如果你对线程的生命周期和状态转移的流程熟记于心,那么面试的时候在纸上给面试官画出来肯定会得到面试官的青睐。希望能够注重面试题的细节和理解,而不是面试题的答案!

    公众号回复“电子书”领取超多、超全电子书籍。

    公众号回复“分布式”领取分布式学习视频。

    我写了一个免费的图片压缩工具:“http://images.houry.top/index” 欢迎大家使用。

    我写了一个netty弹幕系统:“http://bullet-screen.houry.top:8080/index“

你可能感兴趣的:(多线程)