亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Java的線程池有哪些

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

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

線程池簡介

 線程池的概念:

線程池就是首先創建一些線程,它們的集合稱為線程池。使用線程池可以很好地提高性能,線程池在系統啟動時即創建大量空閑的線程,程序將一個任務傳給線程池,線程池就會啟動一條線程來執行這個任務,執行結束以后,該線程并不會死亡,而是再次返回線程池中成為空閑狀態,等待執行下一個任務。

線程池的工作機制:

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

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

使用線程池的原因:

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

四種常見的線程池詳解

4.1 Executors.newCacheThreadPool()

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

代碼:

  1. import java.util.concurrent.ExecutorService;  

  2. import java.util.concurrent.Executors;  

  3. public class ThreadPoolExecutorTest {  

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

  5. //創建一個可緩存線程池  

  6. ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  

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

  8. try {  

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

  10. Thread.sleep(1000);  

  11. catch (InterruptedException e) {  

  12. e.printStackTrace();  

  13. }  

  14. cachedThreadPool.execute(new Runnable() {  

  15. public void run() {  

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

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

  18. }  

  19. });  

  20. }  

  21. }  

  22. }  

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

4.2 Executors.newFixedThreadPool(int n)

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

代碼:

  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. //創建一個可重用固定個數的線程池  

  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. //打印正在執行的緩存線程信息  

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

  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):創建一個定長線程池,支持定時及周期性任務執行

代碼:

  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. //創建一個定長線程池,支持定時及周期性任務執行——延遲執行  

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

  9. //延遲1秒執行  

  10. scheduledThreadPool.schedule(new Runnable() {  

  11. public void run() {  

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

  13. }  

  14. }, 1, TimeUnit.SECONDS);  

  15. }  

  16. }  

輸出結果:延遲1秒執行

代碼2:可以定時執行

  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. //創建一個定長線程池,支持定時及周期性任務執行——定期執行  

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

  9. //延遲1秒后每3秒執行一次  

  10. scheduledThreadPool.scheduleAtFixedRate(new Runnable() {  

  11. public void run() {  

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

  13. }  

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

  15. }  

  16. }  

4.4 Executors.newSingleThreadExecutor()

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

  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. //結果依次輸出,相當于順序執行各個任務  

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

  14. Thread.sleep(1000);  

  15. catch (InterruptedException e) {  

  16. e.printStackTrace();  

  17. }  

  18. }  

  19. });  

  20. }  

  21. }  

  22. }  

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

向AI問一下細節

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

AI

清涧县| 中山市| 东乌珠穆沁旗| 太保市| 邢台县| 阿克苏市| 五家渠市| 桂东县| 福建省| 和平区| 横山县| 库伦旗| 平舆县| 西畴县| 朝阳区| 新野县| 招远市| 噶尔县| 清苑县| 翼城县| 怀远县| 佳木斯市| 梁山县| 开封县| 松阳县| 黄浦区| 买车| 琼海市| 姜堰市| 三江| 台前县| 青阳县| 托克逊县| 天峨县| 仙居县| 元谋县| 望都县| 宿松县| 长顺县| 武威市| 来安县|