線程生命周期
1、線程從創建到結束就是一個生命周期,在一個周期中有各種狀態,可以互相轉換。
2、新建態(NEW):剛創建好的狀態
就緒態(RUNNABLE):線程准備好了運行資源,等待CPU
運行態(RUNNABLE):CPU正在執行
阻塞態:線程主動休息,或者缺少運行資源,即使有CPU也無法運行
TIMED_WAITING:阻塞態,調用了有時間限制的wait方法、sleep方法
BLOCKED:阻塞態(等待鎖、I\O)
WAITING:阻塞態,調用了wait方法,等待喚醒
死亡態(TERMINATED):線程運行完成或出現異常,線程結束
3、狀態轉換圖
4、獲取線程狀態的方法
getState(): 返回當前對象的狀態對象,返回值類型為Thread.State,是Thread的內部類
線程池
1、當沒有線程池時,每次使用都會先創建線程對象,啟動線程,當線程正常結束時,線程對象就會消失,被垃圾回收機制回收,線程的創建和消失浪費了大量的時間;如果任務本身破壞力比較大,可能會把線程對象結束掉,就無法繼續完成任務。
2、當有線程池時,沒有任務的時候,先把線程對象准備好,存儲到一個容器中,當有任務時就可以直接使用,如果任務可以順利完成,這個線程對象不會進入死亡狀態,而是被回收,繼續活躍。如果任務破壞力較大,任務會把線程搞死,線程池會繼續提供下一個線程,繼續完成這個任務。 破壞力較大指耗時大。
3、使用方法:
獲取線程池對象,創建任務對象,將任務對象交給線程池中
4、獲取線程池對象的方法
工具類:Executors:生成線程池的工具類,根據需求生成指定大小的線程池
ExecutorService Executors.newSingleThreadPool():創建一個有單個線程的線程池
ExecutorService Executors.newFixedThreadPool(int nThreads):創建一個指定線程數量的
5、創建任務類對象:Runnable的實現類對象,用於定義任務內容
6、將任務類對象提交到線程池中
ExecutorService:是一個接口,使用方法獲取這個接口的實現類對象,調用這個接口中的方法
submit(Runnable r):可以將一個任務類對象,提交到線程池中,如果有空閑的線程,就可以馬上運行這個任務,如果沒有空閑線程,那么這個任務就需要等待。
shutDown():結束線程池,已經提交的全部保證完成,不准繼續提交了
shutDownNow():結束線程池,已經開始運行的,保證完成;但是還沒有運行的,已經提交的,不給運行了,作為返回值范圍;對於沒有提交的,不准提交。

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Test { public static void main(String[] args) { ExecutorService ns = Executors.newFixedThreadPool(5); Runnable t1 = new Runnable() { @Override public void run() { for(int i=0;i<10;i++) { System.out.println(i); } } }; Runnable t2 = new Runnable() { @Override public void run() { for(int i=10;i<20;i++) { System.out.println(i); } } }; Runnable t3 = new Runnable() { @Override public void run() { for(int i=20;i<30;i++) { System.out.println(i); } } }; Runnable t4 = new Runnable() { @Override public void run() { for(int i=30;i<40;i++) { System.out.println(i); } } }; Runnable t5 = new Runnable() { @Override public void run() { for(int i=40;i<50;i++) { System.out.println(i); } } }; ns.submit(t1); ns.submit(t2); ns.submit(t3); ns.submit(t4); ns.submit(t5); ns.shutdown(); } }