java線程狀態和獲取線程基本信息


1. 線程狀態

新生狀態

new 關鍵字建立一個線程后,該線程對象就處於新生狀態。處於新生狀態的線程有自己的內存空間,通過調用start()方法進入就緒狀態。

就緒狀態

處於就緒狀態線程具備了運行條件,但還沒分配到 CPU,線程處於就緒隊列,等待系統為其分配 CPU。當系統選定一個等待執行的線程后,

它就會從就緒狀態進入執行狀態,該動作稱為“CPU 調度”。

運行狀態

運行狀態的線程執行自己的 run 方法中的代碼,直到等待某資源而阻塞或完成任何而死亡。如果在給定的時間片內沒有執行結束,

就會被系統給換下來回到等待執行狀態。

阻塞狀態

處於運行狀態的線程在某些情況下,如執行了 sleep(睡眠)方法,或等待 I/O 設備等資源,將讓出 CPU 並暫時停止自己運行,進入阻塞狀態。

在阻塞狀態的線程不能進入就緒隊列。只有當引起阻塞的原因消除時,如睡眠時間已到,或等待的I/O 設備空閑下來,線程便轉入就緒狀態,、

重新到就緒隊列中排隊等待,被系統選中后從原來停止的位置開始繼續執行。

死亡狀態

死亡狀態是線程生命周期中的最后一個階段。線程死亡的原因有三個,一個是正常運行的線程完成了它的全部工作;另一個是線程被強制性地終止,

如通過 stop 方法來終止一個線程【不推薦使用】;三是線程拋出未捕獲的異常

 

2.獲取線程基本信息的方法

1)static Thread currentThread()  返回目前正在執行的線程

 1 public class TestThreadMethod {
 2     //主方法,主線程
 3     public static void main(String[] args) {
 4         Thread t=Thread.currentThread();
 5         //toString()方法得到的內容 為 [線程名稱,線程的優先級,線程組的名稱]
 6         System.out.println(t.toString());
 7         
 8         //線程線程類的對象
 9         MyRunnable my=new MyRunnable();
10         Thread t1=new Thread(my);
11         Thread t2=new Thread(my);
12         Thread t3=new Thread(my);
13         
14         //啟動線程
15         t1.start();
16         t2.start();
17         t3.start();
18         /**在Thread類中一定有一個靜態變量int,用於統計創建線程的個數 */
19         //線程的默認的命名規則  Thread - int類型的變量的值
20     }
21 }
22 class MyRunnable implements Runnable{
23 
24     @Override
25     public void run() {
26         Thread t=Thread.currentThread();
27         System.out.println(t);
28     }    
29 }
View Code

2)final String getName()  返回線程的名稱

 1 public class TestGetName {
 2     public static void main(String[] args) {
 3         //主線程的名稱
 4         Thread t=Thread.currentThread();
 5         String name=t.getName();
 6         System.out.println("主線程的名稱:"+name);
 7         
 8         //創建MyRunnable類的對象
 9         MyRunnable my=new MyRunnable();
10         Thread t1=new Thread(my,"自定義的線程1");
11         Thread t2=new Thread(my,"線程2");
12         Thread t3=new Thread(my,"線程3");
13         System.out.println("修改之前:"+t3.getName());
14         //修改線程的名稱
15         t3.setName("自定義的線程------------3");
16         System.out.println("修改之后:"+t3.getName());
17         
18         //啟動線程
19         t1.start();
20         t2.start();
21         t3.start();
22     }
23 }
View Code

3)final boolean isAlive()  判斷線程是否處於活動狀態

 1 public class TestIsAlive {
 2     public static void main(String[] args) {
 3         //主線程
 4         MyThread my=new MyThread();
 5         System.out.println("線程my處於新生狀態的是否處於活動狀態:"+my.isAlive());
 6         my.start();//啟動線程
 7         System.out.println("線程my處於就緒狀態的線程是否處於活動狀態:"+my.isAlive());
 8         //主線程中的循環
 9         for(int i=0;i<5;i++){
10             System.out.println("----------"+Thread.currentThread().getName()+"--------->"+i);
11         }
12         //主線程中的最后一句代碼
13         System.out.println("my線程是否處於活動狀態:"+my.isAlive());
14     }
15 }
16 class MyThread extends Thread{
17     @Override
18     public void run() {
19         for(int i=0;i<5;i++){
20             System.out.println(Thread.currentThread().getName()+"---------->"+i);
21         }
22     }
23 }
View Code

主線程結束,但分支線程未結束的情況

-----------------------------------------------------------------------------------

--------------------------------------------------------------------

主線程和分支線程均已結束的情況

-------------------------------------------------------------------

 

3.線程安全性問題

出現線程安全性問題的條件

1)多線程環境

2)有共享資源

3)對共享資源的非原子性操作

 

4.線程優先級問題

1)final int getPriority()  獲取線程的優先級

2)final void setPriority(int priority)  設置線程的優先級

線程優先級1~10(高)

 1 public class Test {
 2     public static void main(String[] args) {
 3         System.out.println("最高優先級:"+Thread.MAX_PRIORITY);
 4         System.out.println("最低優先級:"+Thread.MIN_PRIORITY);
 5         System.out.println("默認優先級:"+Thread.NORM_PRIORITY);
 6         //主線程的優先級
 7         Thread t=Thread.currentThread();
 8         System.out.println("獲取主線程的優先級:"+t.getPriority());
 9         
10         Thread t2=new Thread(new MyThread());
11         System.out.println("新建的線程優先級為:"+t2.getPriority());
12         /**
13          * 優先級超高越有可能先被調用執行,但是不一定
14          * 
15          */
16          t2.setPriority(6);
17          System.out.println("t2線程的優先級:"+t2.getPriority());
18      // t2.setPriority(100);  非法參數,因為優先級只能是1-10之間的整數
19          
20     }
21 }
22 class MyThread implements Runnable{
23     @Override
24     public void run() {
25     
26     }
27 }
View Code

 


免責聲明!

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



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