帶你玩轉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 超哥想看到贊
兄弟們,給超哥點贊好嗎
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM