線程池及核心參數

1 爲什麼需要線程池

一般來說,線程的生命週期需要通過 new(新建)->start(就緒)->running(運行中)->dead(消亡)
假設每個狀態到下一個狀態需要的時間是
1,2,3 秒
但是我們往往只是關心running 那個狀態就可以了,這是線程需要執行的任務
使用線程池,創建一定數量的線程,專門執行任務的run 方法,實現了線程的複用,同時也減少了其他狀態的佔比,提高了整個系統的運行效率

2 線程池的核心參數

核心線程,最大線程,定義不好解釋,還是看這兩個參數在執行任務的過程中對worker 線程的創建的影響吧。
這兩個參數的目的是:

  1. 儘量少的創建線程(分情況,使用空閒的核心線程,還是先排隊,再使用其他線程執行)
  2. 儘量快的執行任務
  3. 控制最大線程數(資源的限制)
    在這裏插入圖片描述

3 線程池的分類

FixedExcutor:固定線程池大小
SingleThreadPool:單線程,
CachedThreadPool:可緩存

    Executors.newCachedThreadPool();
    Executors.newSingleThreadExecutor();//單線程線程池
    Executors.newFixedThreadPool(2);//固定線程池大小

4 線程池的底層實現

  1. 使用阻塞隊列去放置未被執行的任務
  2. worker 線程則是在執行完當前任務後,從隊列中取出任務執行

核心構造方法:

ThreadPoolExecutor(int corePoolSize,// 核心線程數
                              int maximumPoolSize,// 最大線程數
                              long keepAliveTime,// 線程閒閒置存活時間,如果閒置時間超過改時間,則回收該線程(長時間沒任務)
                              TimeUnit unit,// 時間單位
                              BlockingQueue<Runnable> workQueue)//任務隊列

5阻塞隊列的常用方法;

  1. add/offer 入隊,前者隊列滿時,會拋出異常,後者會返回false,offer 還可以設置時間參數,限時入隊
  2. peek/pool 返回隊頭元素,前者返回,但是不移除,後者返回且移除
  3. 讀寫鎖的使用 (ReentrantLock)takeLock,putLock
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章