Java 線程生命周期、線程池


線程生命周期

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();
    }
}
線程池

 

 

 

 

 

 

 


免責聲明!

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



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