栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Thread实例连续调用start抛出IllegalThreadStateException

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Thread实例连续调用start抛出IllegalThreadStateException

问题描述:

创建一个继承了Thread类的子类,调用 start() 方法启动线程,在线程运行结束退出 run() 方法之后,再次调用 start() 会爆 IllegalThreadStateException。
即连续对同一个Thread实例调用 start() 方法会出现 IllegalThreadStateException。

public class MyTest extends Thread{

    public static void main(String[] args) throws InterruptedException {
        MyTest myTest = new MyTest();
        myTest.start();
        Thread.sleep(1000);
        myTest.start();
    }

    @Override
    public void run() {
        System.out.println("123");
        System.out.println("456");
        System.out.println("run方法结束");
    }
} 


原因分析:

对于同一个Thread实例,在第一次启动后会修改其状态为RUNNABLE,而只有当状态为NEW的Thread实例可以调用 start() 方法启动,所以在RUNNABLE状态下的Thread实例再次 start() 时,会抛出 IllegalThreadStateException。

以下为 start() 方法部分源码,即检测状态从而抛出 IllegalThreadStateException 的地方。

		
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

解决方案:

创建Thread对象时传入Runnable实例再调用 start() 方法即可,即每次都会重新创建一个状态值为 NEW 的线程实例,然后执行同样的方法。

public class MyTest implements Runnable{

    public static void main(String[] args) throws InterruptedException {
        MyTest myTest = new MyTest();
        new Thread(myTest).start();
        Thread.sleep(1000);
        new Thread(myTest).start();
    }

    @Override
    public void run() {
        System.out.println("123");
        System.out.println("456");
        System.out.println("run方法结束");
    }
}

	Result:
		123
		456
		run方法结束
		123
		456
		run方法结束
岁月悠悠,衰微只及肌肤;热忱抛却,腐朽必致灵魂
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704628.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号