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