关于多线程:一个线程能否调用两次start方法

146次阅读

共计 2117 个字符,预计需要花费 6 分钟才能阅读完成。

    欢送大家搜寻“小猴子的技术笔记”关注我的公众号,支付丰盛面试材料和学习材料。

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

     公众号回复“分布式”支付分布式学习视频。

     我写了一个收费的图片压缩工具:“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”这个异样。

    兴许你早就曾经晓得了这个问题的答案,那么面试官真正想考查的到底是什么呢?如果你仅仅会答复进去会抛出异样那么阐明你的根底还行,然而如果你联合线程的生命周期来进行形容的话,那么会让面试官眼前一亮!
    如果你相熟线程的命周期我想就应该会有所理解,线程一共能够通过 6 个不同状态的生命周期。

public enum State {
    // 线程还没有被启动的时候的状态
    NEW,
    // 示意调用了“start()”办法,这里还能够细分为“ready”和“running”状态
    RUNNABLE,
    // 线程期待进入到 synchronized 办法或者期待进入 synchronized 块
    BLOCKED,
    // 示意线程进入期待状态,比方调用了“wait()”、“join()”等
    WAITING,
    // 带有超时工夫的
    TIMED_WAITING,
    // 线程失常完结,或者强制进行,或者遇到异样终止之后的状态
    TERMINATED;
}

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


    能够看到,只有处于 NEW 状态的线程才可能执行“start()”办法。也就是第二次调用“start()”办法的时候,线程可能终止或者其余非 NEW 的状态,因而无论如何都是不可能反复调用的。

    面试官想考你这个问题的实质也就是想理解你对线程的生命周期和状态本义有没有一个很好的集体认知,而不是单纯的背诵面试题。如果你对线程的生命周期和状态转移的流程熟记于心,那么面试的时候在纸上给面试官画进去必定会失去面试官的青眼。心愿可能重视面试题的细节和了解,而不是面试题的答案!

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

     公众号回复“分布式”支付分布式学习视频。

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

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

正文完
 0