您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~
開完一趟車完整的程序是啟動、行駛和停車,但老司機都知道,真正費油的不是行駛,而是長時間的怠速、頻繁地踩剎車等動作,因為在速度切換的程序中,發送機要多做一些作業,當然就要多費一些油,
而一個Java執行緒完整的生命周期就包括:
1、T1:創建(啟動)
2、T2:運行(行駛)
3、T3:銷毀(停車)
而T1 + T3的開銷(汽油或者時間)是要遠大于T2的,所以,即使是性能再好的車,或者性能再好的計算機,如果經常有T1 + T3的操作存在,那么顯然是扛不住的,
所以,為了解決這種因為切換不同執行緒導致的效率問題,Java推出了執行緒池技術,通過對已創建執行緒的合理重用,既能解決上述問題,又能進一步提高回應速度,提升系統性能和穩定性,執行緒池特別適合下面的應用場景:
1、單個任務處理時間較短
2、需要處理的任務數量大
比如硬體資料采集,像手機、車載和安防傳感器的資料采集就特別符合這種情況,
這是執行緒池相關繼承結構圖:

很多人都分不清Executor和Executors這兩個東西:Executor是介面,是一個根據一組執行策略呼叫、調度、執行和控制的異步任務框架,提供了一種將“任務提交”與“任務如何運行”分離開的機制,而Executors則是一個工具類(不用new),提供了諸多用于執行緒池的靜態方法,Executor和Executors的關系,和Java I/O中Collection和Collections的關系一毛一樣,所以下次再看到XXX和XXXs的時候應該就知道Java的調性了,
說起來還是有點枯燥,那么我拿之前做的一個例子來說一下就明白了,
假設有一個工地有若干專案經理和工人,1個經理+1個工人組成作業小隊,工地有很多個這樣的作業小隊,這些作業小隊需要加入專案組,但是只有有活干的才能加入,沒活干的加不了,就能要被優化裁員,
/** * 工人 * * @author 湘王 */ public class Worker { /** * 干活 */ public void dosomething() { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("挖坑"); } }
/** * 經理 * * @author 湘王 */ public class Manager implements Runnable { private Worker worker; public Worker getWorker() { return worker; } public void setWorker(Worker worker) { this.worker = worker; } /** * 經理動嘴,工人動手 */ @Override public void run() { worker.dosomething(); } }
/** * 專案組 * * @author 湘王 */ public class ManagerGroup { private static ExecutorService projectGroup = new ThreadPoolExecutor( 3, // 核心小隊數量 3, // 最多能容納多少個小隊 30, // 多久沒活干就請出專案組 TimeUnit.SECONDS, // 時間單位 new ArrayBlockingQueue<Runnable>(3),// 有多少個專案經理就不再接收入組申請 new ThreadPoolExecutor.CallerRunsPolicy() // 專案組拒絕回應時怎么處理 ); // 專案組增加作業小隊 public static void addTask(Manager manager) { projectGroup.execute(manager); } public static void main(String[] args) { Manager manager1 = new Manager(); Worker worker1 = new Worker(); manager1.setWorker(worker1); Manager manager2 = new Manager(); Worker worker2 = new Worker(); manager2.setWorker(worker2); Manager manager3 = new Manager(); Worker worker3 = new Worker(); manager3.setWorker(worker3); // 申請進入專案組有活干才可能不被優化 ManagerGroup.addTask(manager1); ManagerGroup.addTask(manager2); ManagerGroup.addTask(manager3); } }
可以自己將核心小組數量、最多能容納的小隊數量等數字調節一下,然后運行看看效果,
和執行緒一樣,執行緒池也有自己的狀態,而且和執行緒的狀態差不多(想想也是,畢竟要符合執行緒生命周期的東西,確實應該差不多),執行緒池狀態:

1、RUNNING:正常運行,能接收新任務,也能處理阻塞佇列中的任務;
2、SHUTDOWN:關閉狀態,不接收新任務,但可以繼續處理阻塞佇列中已有任務;
3、STOP:既不接收新任務,也不處理佇列中的任務,并會中斷正在處理的任務;
4、TIDYING(這個名字叫得有點奇怪):如果所有任務都已中止,且workCount有效執行緒數為0,則會呼叫terminated()方法進入TERMINATED狀態;
5、TERMINATED:terminated()方法執行完后進入該狀態,什么也不做,
執行緒池運行時的流程圖:

至于執行緒池的建構式什么的就不多啰嗦了,太枯燥無聊,
感謝您的大駕光臨!咨詢技術、產品、運營和管理相關問題,請關注后留言,歡迎騷擾,不勝榮幸~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519046.html
標籤:其他
上一篇:淺談PHP設計模式的工廠模式
