线程连续两次调用start()方法

示例代码

public class TestMain {

    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("开始运行");
            }
        });
        System.out.println("线程当前的状态为" + thread.getState());
        thread.start();
        System.out.println("start后线程当前的状态为" + thread.getState());
        thread.start();
    }
}

运行结果:
在这里插入图片描述
可以发现,第一次调用start()方法能够有结果,而第二次则报了IllegalThreadStateException异常。

原因分析

以下是start()方法小部分源码:

 //线程一被new出来就会有这个变量,默认值为0,代表着线程处于NEW状态
 private volatile int threadStatus = 0;
 
 public synchronized void start() {
       //如果线程状态不等于0,说明线程状态已经不是NEW了,不是NEW说明至少已经开始运行了,再走start()方法就没意义了,所以会抛出IllegalThreadStateException异常
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
}

总结

线程连续两次调用start()方法,会抛出IllegalThreadStateException异常。

发布了213 篇原创文章 · 获赞 214 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104530115