線程池創(chuàng)建

      網(wǎng)友投稿 652 2025-04-11

      一、線程池


      首先概括一下線程池的概念,線程池相當(dāng)于一個(gè)包裝袋,袋子里有多個(gè)線程,在沒有任務(wù)時(shí),這些線程都是睡眠的,當(dāng)有任務(wù)需要執(zhí)行某個(gè)程序時(shí),會(huì)調(diào)用相應(yīng)的線程,被調(diào)用的線程會(huì)醒,執(zhí)行過后繼續(xù)睡眠。系統(tǒng)可以同時(shí)調(diào)用多個(gè)線程。

      通過線程池可以啟動(dòng)多線程,Executors的工具類可以創(chuàng)建線程。線程池的有以下幾個(gè)有點(diǎn):

      提高系統(tǒng)響應(yīng)速度,當(dāng)有任務(wù)時(shí),復(fù)用已存在的線程,無需等待新的線程創(chuàng)建就可以立即執(zhí)行任務(wù)

      降低系統(tǒng)資源消耗,復(fù)用已存在的線程,降低了新建和銷毀線程的損耗

      方便線程管控,因?yàn)榫€程如果無限制創(chuàng)建,會(huì)占用過多的內(nèi)存,并且造成cpu切換過渡

      二、創(chuàng)建線程池

      1.FixThreadPool(int n)固定大小的線程池

      public class FixThreadPoolTest { public static void main(String[] args) { // TODO Auto-generated method stub //創(chuàng)建固定大小線程的線程池 ExecutorService ex = Executors.newFixedThreadPool(3); //用線程池執(zhí)行任務(wù) for(int i = 0;i<3;i++) { ex.submit(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for(int j = 0;j<10;j++) { System.out.println(Thread.currentThread().getName()+" "+j); } } }); } // ex.submit(new Runnable() { // // @Override // public void run() { // // TODO Auto-generated method stub // for(int j = 0;j<10;j++) { // System.out.println(Thread.currentThread().getName()+" "+j); // } // } // // });只創(chuàng)建一個(gè)線程 //關(guān)閉線程池,會(huì)把原先的任務(wù)執(zhí)行完,但不會(huì)再執(zhí)行新的任務(wù) ex.shutdown(); //通過結(jié)果表明,三個(gè)線程一共要執(zhí)行5次,每個(gè)線程執(zhí)行次數(shù)是隨機(jī)的

      線程池的創(chuàng)建

      2.SingleThreadPoolExcutor單線程池

      單線程池只能創(chuàng)建一個(gè)線程,優(yōu)點(diǎn)是能夠串行執(zhí)行任務(wù),保證任務(wù)執(zhí)行順序按照任務(wù)提交順序

      import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SingleThreadExecutor { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService ex = Executors.newSingleThreadExecutor(); for(int i = 0;i<5;i++) { ex.submit(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for(int j = 0;j<10;j++) { System.out.println(Thread.currentThread().getName()+" "+j); } } }); } ex.shutdown(); } }

      3.CashedThreadPool()緩存線程池

      可以創(chuàng)建多個(gè)線程,數(shù)量不固定,線程最大值是int類型的最大值。當(dāng)沒有可用線程時(shí),可以創(chuàng)建新的線程。

      import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CashedThreadPoolTest { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService ex =Executors.newCachedThreadPool(); for(int i = 0;i<5;i++) { ex.submit(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for(int j = 0;j<10;j++) { System.out.println(Thread.currentThread().getName()+" "+j); } } }); } ex.shutdown(); //需要執(zhí)行5次線程任務(wù),根據(jù)結(jié)果表明,創(chuàng)建了五個(gè)線程,5個(gè)線程每個(gè)都執(zhí)行一遍for循環(huán) } }

      4.newScheduledThreadPool()創(chuàng)建一個(gè)周期性的線程池,支持定時(shí)及周期性執(zhí)行任務(wù)

      傳遞的是核心線程數(shù),不是固定線程數(shù)。核心線程數(shù)是線程池維護(hù)的最小線程數(shù),不會(huì)被回收

      import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduleThreadPoolTest { public static void main(String[] args) { // TODO Auto-generated method stub ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName()+"執(zhí)行"+new Date()); } }, 5, 3, TimeUnit.SECONDS); } }

      5.newWorkStealingPool新的線程池類ForkJoinPool擴(kuò)展

      JDK8之后新出的線程池類,之前的線程池類中的線程共享任務(wù)隊(duì)列。在這個(gè)線程池中,每一個(gè)下次線程都有自己的隊(duì)列,會(huì)造成CPU負(fù)載不均衡,可能有一個(gè)線程執(zhí)行的任務(wù)過重。當(dāng)線程發(fā)現(xiàn)自己沒有任務(wù)時(shí),回去其他線程中拿到任務(wù),這樣節(jié)省了執(zhí)行任務(wù)的時(shí)間

      import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NewWorkStealingPoolTest { public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub System.out.println("--start--"); ExecutorService executorService = Executors.newWorkStealingPool(); for(int i = 0;i<10;i++) { executorService.submit(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for(int j = 0;j<5;j++) { System.out.println(Thread.currentThread().getName()+" "+j); } } }); } Thread.sleep(3000);//讓主線程等待3秒,等子線程執(zhí)行完任務(wù) System.out.println("--end--"); //如果一個(gè)線程分配到了一個(gè)很大的任務(wù),會(huì)把任務(wù)分成多個(gè)小任務(wù)再分配給各個(gè)線程,小任務(wù)執(zhí)行完最后把結(jié)果合并 } }

      根據(jù)結(jié)果表明,每次運(yùn)行后,創(chuàng)建的線程數(shù)是不固定的,可能3個(gè)也可能4個(gè)

      Java 培訓(xùn)服務(wù)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:打印文件瀏覽可以,打印一部分文字打印不上(打印機(jī)打印不出文檔中的文字)
      下一篇:用了符號(hào)后就不能正常輸入英文了
      相關(guān)文章
      亚洲gv猛男gv无码男同短文| 国产aⅴ无码专区亚洲av| 亚洲国产成人久久精品动漫| 精品亚洲视频在线观看| 亚洲av中文无码字幕色不卡| 亚洲天然素人无码专区| 亚洲精品无码国产片| 亚洲综合在线一区二区三区 | 亚洲色欲一区二区三区在线观看| 亚洲精品第一国产综合境外资源| 亚洲精品国产va在线观看蜜芽| 亚洲成网777777国产精品| 亚洲国产精品碰碰| 精品亚洲视频在线观看| 亚洲人成在线播放网站| 情人伊人久久综合亚洲| 亚洲AV综合色区无码一区| 亚洲av丰满熟妇在线播放| 亚洲国产人成网站在线电影动漫| 亚洲专区在线视频| 亚洲国产高清视频在线观看| 精品亚洲成在人线AV无码| 丁香婷婷亚洲六月综合色| 亚洲欧美日韩综合久久久久| 亚洲a∨无码一区二区| 亚洲国产精品丝袜在线观看| 国产亚洲色视频在线| 亚洲国产精品无码久久久不卡 | 日本红怡院亚洲红怡院最新| 亚洲av永久无码制服河南实里| 久久国产亚洲电影天堂| 亚洲欧洲自拍拍偷午夜色| 亚洲一卡2卡4卡5卡6卡残暴在线| 亚洲人成网站在线播放2019| 国产亚洲蜜芽精品久久| 中国亚洲女人69内射少妇| 久久久久久a亚洲欧洲AV| 亚洲成在人线电影天堂色| 亚洲中文字幕久久无码| 国产成人+综合亚洲+天堂| 国产美女亚洲精品久久久综合|