溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的線程池有哪些

發(fā)布時間:2021-12-22 14:20:18 來源:億速云 閱讀:104 作者:iii 欄目:編程語言

這篇文章主要講解了“Java的線程池有哪些”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java的線程池有哪些”吧!

線程池簡介

 線程池的概念:

線程池就是首先創(chuàng)建一些線程,它們的集合稱為線程池。使用線程池可以很好地提高性能,線程池在系統(tǒng)啟動時即創(chuàng)建大量空閑的線程,程序?qū)⒁粋€任務傳給線程池,線程池就會啟動一條線程來執(zhí)行這個任務,執(zhí)行結(jié)束以后,該線程并不會死亡,而是再次返回線程池中成為空閑狀態(tài),等待執(zhí)行下一個任務。

線程池的工作機制:

         在線程池的編程模式下,任務是提交給整個線程池,而不是直接提交給某個線程,線程池在拿到任務后,就在內(nèi)部尋找是否有空閑的線程,如果有,則將任務交給某個空閑的線程。

         一個線程同時只能執(zhí)行一個任務,但可以同時向一個線程池提交多個任務。

使用線程池的原因:

        多線程運行時間,系統(tǒng)不斷的啟動和關(guān)閉新線程,成本非常高,會過渡消耗系統(tǒng)資源,以及過渡切換線程的危險,從而可能導致系統(tǒng)資源的崩潰。這時,線程池就是最好的選擇了。

四種常見的線程池詳解

4.1 Executors.newCacheThreadPool()

Executors.newCacheThreadPool():可緩存線程池,先查看池中有沒有以前建立的線程,如果有,就直接使用。如果沒有,就建一個新的線程加入池中,緩存型池子通常用于執(zhí)行一些生存期很短的異步型任務

代碼:

  1. import java.util.concurrent.ExecutorService;  

  2. import java.util.concurrent.Executors;  

  3. public class ThreadPoolExecutorTest {  

  4. public static void main(String[] args) {  

  5. //創(chuàng)建一個可緩存線程池  

  6. ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  

  7. for (int i = 0; i < 10; i++) {  

  8. try {  

  9. //sleep可明顯看到使用的是線程池里面以前的線程,沒有創(chuàng)建新的線程  

  10. Thread.sleep(1000);  

  11. catch (InterruptedException e) {  

  12. e.printStackTrace();  

  13. }  

  14. cachedThreadPool.execute(new Runnable() {  

  15. public void run() {  

  16. //打印正在執(zhí)行的緩存線程信息  

  17. System.out.println(Thread.currentThread().getName()+"正在被執(zhí)行");  

  18. }  

  19. });  

  20. }  

  21. }  

  22. }  

線程池為無限大,當執(zhí)行當前任務時上一個任務已經(jīng)完成,會復用執(zhí)行上一個任務的線程,而不用每次新建線程

4.2 Executors.newFixedThreadPool(int n)

Executors.newFixedThreadPool(int n):創(chuàng)建一個可重用固定個數(shù)的線程池,以共享的無界隊列方式來運行這些線程。

代碼:

  1. package com.study.test;  

  2. import java.util.concurrent.ExecutorService;  

  3. import java.util.concurrent.Executors;  

  4. public class ThreadPoolExecutorTest {  

  5. public static void main(String[] args) {  

  6. //創(chuàng)建一個可重用固定個數(shù)的線程池  

  7. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  

  8. for (int i = 0; i < 10; i++) {  

  9. fixedThreadPool.execute(new Runnable() {  

  10. public void run() {  

  11. try {  

  12. //打印正在執(zhí)行的緩存線程信息  

  13. System.out.println(Thread.currentThread().getName()+"正在被執(zhí)行");  

  14. Thread.sleep(2000);  

  15. catch (InterruptedException e) {  

  16. e.printStackTrace();  

  17. }  

  18. }  

  19. });  

  20. }  

  21. }  

  22. }  

  23. }  

4.3 Executors.newScheduledThreadPool(int n)

 Executors.newScheduledThreadPool(int n):創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行

代碼:

  1. package com.study.test;  

  2. import java.util.concurrent.Executors;  

  3. import java.util.concurrent.ScheduledExecutorService;  

  4. import java.util.concurrent.TimeUnit;  

  5. public class ThreadPoolExecutorTest {  

  6. public static void main(String[] args) {  

  7. //創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行——延遲執(zhí)行  

  8. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  

  9. //延遲1秒執(zhí)行  

  10. scheduledThreadPool.schedule(new Runnable() {  

  11. public void run() {  

  12. System.out.println("延遲1秒執(zhí)行");  

  13. }  

  14. }, 1, TimeUnit.SECONDS);  

  15. }  

  16. }  

輸出結(jié)果:延遲1秒執(zhí)行

代碼2:可以定時執(zhí)行

  1. package com.study.test;  

  2. import java.util.concurrent.Executors;  

  3. import java.util.concurrent.ScheduledExecutorService;  

  4. import java.util.concurrent.TimeUnit;  

  5. public class ThreadPoolExecutorTest {  

  6. public static void main(String[] args) {  

  7. //創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行——定期執(zhí)行  

  8. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  

  9. //延遲1秒后每3秒執(zhí)行一次  

  10. scheduledThreadPool.scheduleAtFixedRate(new Runnable() {  

  11. public void run() {  

  12. System.out.println("延遲1秒后每3秒執(zhí)行一次");  

  13. }  

  14. }, 1, 3, TimeUnit.SECONDS);  

  15. }  

  16. }  

4.4 Executors.newSingleThreadExecutor()

 Executors.newSingleThreadExecutor():創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務,保證所有任務按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。

  1. package com.study.test;  

  2. import java.util.concurrent.ExecutorService;  

  3. import java.util.concurrent.Executors;  

  4. public class TestThreadPoolExecutor {  

  5. public static void main(String[] args) {  

  6. ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();  

  7. for (int i = 0; i < 10; i++) {  

  8. final int index = i;  

  9. singleThreadExecutor.execute(new Runnable() {  

  10. public void run() {  

  11. try {  

  12. //結(jié)果依次輸出,相當于順序執(zhí)行各個任務  

  13. System.out.println(Thread.currentThread().getName()+"正在被執(zhí)行,打印的值是:"+index);  

  14. Thread.sleep(1000);  

  15. catch (InterruptedException e) {  

  16. e.printStackTrace();  

  17. }  

  18. }  

  19. });  

  20. }  

  21. }  

  22. }  

感謝各位的閱讀,以上就是“Java的線程池有哪些”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Java的線程池有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI