带你玩转java多线程系列 一 java.lang.IllegalThreadStateException异常

时间:2022-10-22 17:34:06
java的线程状态和java.lang.IllegalThreadStateException异常
文章结构:
 
1 阐明java声明周期的六种状态
2 由于自己操作错误,对同一个线程实例同时调用了两次start方法从而抛了java.lang.IllegalThreadStateException这个异常
3 超哥带你分析为啥抛了这个异常
4 超哥想看到赞 哈哈
 
1 阐明java声明周期的六种状态
 
线程的生命周期有六种,由Thread.State枚举类表示,线程的状态可以用getState方法来查询,有如下
NEW Thread被创建,但start方法没有被调用
RUNNABLE 线程正在运行或在操作系统调度它时可运行
BLOCKED 线程被阻塞,等待获取锁
WAITING 线程调用object的wait方法或者Thread的join方法而没有运行
TIMED_WAITING 线程调用Thread类的sleep方法 或加一定延时调用object的wait方法或者Thread的join方法
TERMINATED 线程run方法正常或者抛出异常结束
在这里 Model 类是继承Thread 的线程类
 
2 超哥写的抛出异常的示例代码
 
public static void main(String[] args) {

Model model
= new Model();

model.start();

model.start();

}


class Model extends Thread{

int num = 20;



@Override

public void run() {

// TODO Auto-generated method stub

while(num>0){

System.out.println(Thread.currentThread().getName()
+" "+num);

num
--;

}

}

}

运行结果
Exception in thread "main" java.lang.IllegalThreadStateException
 at java.lang.Thread.start(Unknown Source)
 at TeachMultiThread.teach1.main(teach1.java:7)
Thread-0 20
Thread-0 19
Thread-0 18
Thread-0 17
Thread-0 16
Thread-0 15
Thread-0 14
Thread-0 13
Thread-0 12
Thread-0 11
Thread-0 10
Thread-0 9
Thread-0 8
Thread-0 7
Thread-0 6
Thread-0 5
Thread-0 4
Thread-0 3
Thread-0 2
Thread-0 1

对同一个线程类,不能同时调用两次start方法 也对,调用start方法后model类的状态变化了 
 
3 超哥带你分析为啥抛了这个异常
 
当我们对model这个实例调用start方法是,model这个线程实例的状态已经变为了RUNNABLE 这个状态,当我们再次调用start方法的时候由于不是NEW这个状态当然
会抛出 IllegalThreadStateException这个异常了
 
我们可以来测试一下
public class teach1 {
    public static void main(String[] args) {
        Model model = new Model();
        model.start();
        System.out.println(model.getState());
    }
}
class Model extends Thread{
    int num = 20;
 
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(num>0){
            System.out.println(Thread.currentThread().getName()+" "+num);
            num--;
        }
    }
}
Thread-0 20
RUNNABLE
Thread-0 19
Thread-0 18
Thread-0 17
Thread-0 16
Thread-0 15
Thread-0 14
Thread-0 13
Thread-0 12
Thread-0 11
Thread-0 10
Thread-0 9
Thread-0 8
Thread-0 7
Thread-0 6
Thread-0 5
Thread-0 4
Thread-0 3
Thread-0 2
Thread-0 1
 可以看出上述输出结果打印了RUNNABLE
 
4 超哥想看到赞
兄弟们,给超哥点赞好吗