前言
阿里的Java開發者手冊中對於線程池的創建有很多強制性的限制,其中最重要的一條就是:
線程池不允許使用Executors去創建,那我們改如何正確的使用Java線程池技術呢?Java線程池使用場景
Java線程池技術是我們經常會用到的一項技術,例如定時任務、異步數據處理、隊列等我們都會用到線程池技術。Java的JUC包有很多API可以讓我們創建一個線程池,那這些API我們改如何正確使用呢?為什麼在阿里的Java開發者手冊中對於線程池的創建有很多強制性的限制?例如,不能使用Excuro來創建線程池。這篇文章將詳細為大家介紹Java線程池的幾種類型以及如何正確創建線程池。
![60%的Java程序員在錯誤的使用線程池,如何正確創建線程池](http://p2.ttnews.xyz/loading.gif)
四種內置線程池
![60%的Java程序員在錯誤的使用線程池,如何正確創建線程池](http://p2.ttnews.xyz/loading.gif)
Java JUC包中有四種內置的線程池技術,包括單線程的線程池、固定大小的線程池、可緩存的線程池、定時執行的線程池。
- 1、單線程的線程池(newSingleThreadExecutor)
單線程的線程池中只有一個線程,也就是所有任務都是通過這一個線程來串行執行,保證了執行任務按照提交順序來執行。如果業務只是涉及到異步執行,可選擇該線程池技術。
- 2、固定大小的線程池(newFixedThreadPool)
固定大小的線程池創建的時候限制了線程池中線程的數量。當有新的任務創建的時候,就創建一個新的線程來執行任務。
當線程池中的線程數量達到設定的值的時候,任務開始等待執行,直到有可用的線程。- 3、可緩存的線程池(newCachedThreadPool)
可緩存的線程池不限定線程數量,當有新的任務加入,如果沒有可用的線程,那就創建新的線程。線程最大數量取決於操作系統所能創建的最大線程數量。此線程池技術也是項目開發中不被推薦的一種方法,因為如何控制不好任務數量,將會導致大量的線程被創建,影響系統的性能。
- 4、定時執行的線程池(newScheduledThreadPool)
定時執行的線程池支持創建無線數量的線程池,並且線程按照設定的時間週期執行。
四種線程池適用不同的業務場景,我們可以根據業務類型來選擇使用。JUC中提供了很多API可以讓我們方便的創建以上四種線程池技術,例如:
- Executors.newScheduledThreadPool(200)來創建定時執行的線程池;
- new ThreadPoolExecutor()來創建ThreadPoolExecutord對象,再創建線程池;
那我們該如何正確創建線程池呢?
正確創建線程池
在阿里巴巴Java開發者手冊中有明確規定:禁止使用Executors來創建線程池。
之所以禁止使用Executors創建線程池主要有以下幾點原因:
- 第一、Executors創建線程池的時候省去了很多參數,大多都是默認的參數, 導致開發者不能很好理解線程池的運行策略。
- 第二、使用Executors來創建FixedThreadPool和SingleThreadPool的時候,默認的隊列長度是Integer.MAX_VALUE,即2147483647,這會堆積大量的請求,如果系統處理不過來,就會導致OOM。
- 第三、使用Executors來創建CachedThreadPool的時候,默認的線程數量是Integer.MAX_VALUE。如果是高併發請求,會導致大量的線程被創建,最終耗盡系統內存,發生內存溢出。
所以,在創建線程池的時候,我們需要正確而嚴謹的使用合理的方式創建,如果使用不當,就會導致系統發生故障。
最後
線程池的正確使用是一個程序員從初級到中高級的標誌,中高級的程序員會接觸到更多需要線程池技術來解決的業務場景。所以,精通線程池技術策略以及正確使用線程池尤為重要,希望大家在項目開發中可以合理使用線程池技術,提高系統性能。
閱讀更多 阿邁達聊技術 的文章