线程多次调用start方法,引发的异常

本文探讨了Java中线程启动时出现的异常情况,并通过对比分析了使用Thread类与Runnable接口的区别,指出了重复调用start方法导致的问题所在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单的线程使用,大家应该都会使用,下面的这个问题,不知道大家有没有注意过。

public class Test146 {
    public static void main(String[] args) {
        MyThread11 m = new MyThread11();
        for(int i = 0;i<5;i++) {
            m.start();
        }

    }
}

class MyThread11 extends Thread{
          @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            System.out.println("我是线程任务");
        }
}

运行结果如下:

这里写图片描述

接下来,我们就要看这个异常是如何产生的。网上对此解释,说是在循环的时候,共用了一个Thread对象。可是为什么共用了一个Thread对象,就引发错误了呢。

       private volatile int threadStatus = 0;
       A zero status value corresponds to state "NEW".
       if (threadStatus != 0)
            throw new IllegalThreadStateException();

我们都知道,线程的五种生命周期, 新建->就绪->运行->死亡->堵塞。在每次实例化的时候,会给这个threadStatus 为0,用volatile ,可以保证该变量的可见性。在不同的生命周期,值会变,而在start方法通过判断,就可以知道执行的线程是不是一个新的线程实例。

由上面的,我们可以看出如果我们保证每次都使用的不是同一个Thread实例,就可以解决上面的问题。我们试试创建线程的另一个方法,实现runnable。每一个任务都是包装在一个Thread实例中,所以,执行循环任务,不会出现上述的问题。

代码如下:

        Thread t;
        for(int i = 0;i<5;i++) {
         t = new Thread(new MyTask11());//MyTask11内容和MyThread11一致,就是它是通过implement实现Thread,不是继承。
         t.start();
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值