zoukankan      html  css  js  c++  java
  • 带你玩转java多线程系列 一 java.lang.IllegalThreadStateException异常

    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 超哥想看到赞
    兄弟们,给超哥点赞好吗
     
  • 相关阅读:
    自定义类似smarty模板
    PHP函数相关知识点
    cookie的使用和设置
    进程通过内核缓存区请求设备I/O的一些事情
    多线程模型和问题
    C10K问题和多进程模型
    node.js----一个httpserver提交和解析get参数的例子
    nodejs解析url参数的三种方法
    node.js http模块和fs模块上机实验·
    c++中的srand()和rand() 转载 自:http://blog.sina.com.cn/s/blog_624c2c4001012f67.html
  • 原文地址:https://www.cnblogs.com/winAlaugh/p/5473407.html
Copyright © 2011-2022 走看看