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 }
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 }
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 }
主線程結束,但分支線程未結束的情況
-----------------------------------------------------------------------------------
--------------------------------------------------------------------
主線程和分支線程均已結束的情況
-------------------------------------------------------------------
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 }