在什么情況下使用線程池?
創(chuàng)新互聯(lián)建站為您提適合企業(yè)的網(wǎng)站設(shè)計(jì)?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強(qiáng)的網(wǎng)絡(luò)競爭力!結(jié)合企業(yè)自身,進(jìn)行網(wǎng)站設(shè)計(jì)及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè), 我們的網(wǎng)頁設(shè)計(jì)師為您提供的解決方案。
1.單個(gè)任務(wù)處理的時(shí)間比較短
2.將需處理的任務(wù)的數(shù)量大
使用線程池的好處:
1.減少在創(chuàng)建和銷毀線程上所花的時(shí)間以及系統(tǒng)資源的開銷
2.如不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量線程而導(dǎo)致消耗完系統(tǒng)內(nèi)存以及”過度切換”。
本文詳細(xì)的給大家介紹了關(guān)于Java中四種線程池的使用,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹:
FixedThreadPool
由Executors的newFixedThreadPool方法創(chuàng)建。它是一種線程數(shù)量固定的線程池,當(dāng)線程處于空閑狀態(tài)時(shí),他們并不會(huì)被回收,除非線程池被關(guān)閉。當(dāng)所有的線程都處于活動(dòng)狀態(tài)時(shí),新的任務(wù)都會(huì)處于等待狀態(tài),直到有線程空閑出來。FixedThreadPool只有核心線程,且該核心線程都不會(huì)被回收,這意味著它可以更快地響應(yīng)外界的請求。
FixedThreadPool沒有額外線程,只存在核心線程,而且核心線程沒有超時(shí)機(jī)制,而且任務(wù)隊(duì)列沒有長度的限制。
public class ThreadPoolExecutorTest { public static void main(String[] args) { ExecutorService fixedThreadPool =Executors. newFixedThreadPool(3); for (int i =1; i<=5;i++){ final int index=i ; fixedThreadPool.execute(new Runnable(){ @Override public void run() { try { System.out.println("第" +index + "個(gè)線程" +Thread.currentThread().getName()); Thread.sleep(1000); } catch(InterruptedException e ) { e .printStackTrace(); } } }); } } }
CachedThreadPool
由Executors的newCachedThreadPool方法創(chuàng)建,不存在核心線程,只存在數(shù)量不定的非核心線程,而且其數(shù)量最大值為Integer.MAX_VALUE。當(dāng)線程池中的線程都處于活動(dòng)時(shí)(全滿),線程池會(huì)創(chuàng)建新的線程來處理新的任務(wù),否則就會(huì)利用新的線程來處理新的任務(wù),線程池中的空閑線程都有超時(shí)機(jī)制,默認(rèn)超時(shí)時(shí)長為60s,超過60s的空閑線程就會(huì)被回收。和FixedThreadPool不同的是,CachedThreadPool的任務(wù)隊(duì)列其實(shí)相當(dāng)于一個(gè)空的集合,這將導(dǎo)致任何任務(wù)都會(huì)被執(zhí)行,因?yàn)樵谶@種場景下SynchronousQueue是不能插入任務(wù)的,SynchronousQueue是一個(gè)特殊的隊(duì)列,在很多情況下可以理解為一個(gè)無法儲(chǔ)存元素的隊(duì)列。從CachedThreadPool的特性看,這類線程比較適合執(zhí)行大量耗時(shí)較小的任務(wù)。當(dāng)整個(gè)線程池都處于閑置狀態(tài)時(shí),線程池中的線程都會(huì)因?yàn)槌瑫r(shí)而被停止回收,幾乎是不占任何系統(tǒng)資源。
ScheduledThreadPool
通過Executors的newScheduledThreadPool方式創(chuàng)建,核心線程數(shù)量是固定的,而非核心線程是沒有限制的,并且當(dāng)非核心線程閑置時(shí)它會(huì)被立即回收,ScheduledThreadPool這類線程池主要用于執(zhí)行定時(shí)任務(wù)和具有固定時(shí)期的重復(fù)任務(wù)。
延遲:
public class ThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); scheduledThreadPool.schedule(newRunnable(){ @Override public void run() { System.out.println("延遲三秒"); } }, 3, TimeUnit.SECONDS); } }
定時(shí):
public class ThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); scheduledThreadPool.scheduleAtFixedRate(newRunnable(){ @Override public void run() { System.out.println("延遲1秒后每三秒執(zhí)行一次"); } },1,3,TimeUnit.SECONDS); } }
SingleThreadExecutor
通過Executors的newSingleThreadExecutor方法來創(chuàng)建。這類線程池內(nèi)部只有一個(gè)核心線程,它確保所有的任務(wù)都在同一個(gè)線程中按順序執(zhí)行。SingleThreadExecutor的意義在于統(tǒng)一所有外界任務(wù)一個(gè)線程中,這使得這些任務(wù)之間不需要處理線程同步的問題
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。