中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Java的線程池有哪些

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

創(chuàng)新互聯(lián)公司是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷、企業(yè)網(wǎng)站建設(shè),賣友情鏈接1元廣告為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計(jì)到用戶體驗(yàn)提高,創(chuàng)新互聯(lián)力求做到盡善盡美。

線程池簡(jiǎn)介

 線程池的概念:

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

線程池的工作機(jī)制:

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

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

使用線程池的原因:

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

四種常見的線程池詳解

4.1 Executors.newCacheThreadPool()

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

代碼:

  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)建一個(gè)可緩存線程池  

  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. }  

線程池為無(wú)限大,當(dāng)執(zhí)行當(dāng)前任務(wù)時(shí)上一個(gè)任務(wù)已經(jīng)完成,會(huì)復(fù)用執(zhí)行上一個(gè)任務(wù)的線程,而不用每次新建線程

4.2 Executors.newFixedThreadPool(int n)

Executors.newFixedThreadPool(int n):創(chuàng)建一個(gè)可重用固定個(gè)數(shù)的線程池,以共享的無(wú)界隊(duì)列方式來運(yù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. //創(chuàng)建一個(gè)可重用固定個(gè)數(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)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(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)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(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:可以定時(shí)執(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)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(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)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(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é)果依次輸出,相當(dāng)于順序執(zhí)行各個(gè)任務(wù)  

  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)過本文的學(xué)習(xí)后,相信大家對(duì)Java的線程池有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

新聞標(biāo)題:Java的線程池有哪些
文章路徑:http://www.rwnh.cn/article34/jipdpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站改版App開發(fā)、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站排名、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司
乡城县| 德庆县| 临颍县| 开阳县| 惠水县| 方城县| 通辽市| 邵东县| 通江县| 南部县| 大庆市| 依兰县| 霍州市| 闽清县| 莫力| 女性| 高雄县| 双江| 樟树市| 岱山县| 宁津县| 临漳县| 叙永县| 康马县| 临江市| 岳普湖县| 柘城县| 湖州市| 琼海市| 孟津县| 六盘水市| 巨鹿县| 手机| 临海市| 日土县| 虎林市| 启东市| 融水| 东丽区| 伊通| 九龙县|