1祈争、線程池作用
線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量,且復(fù)用以前工作線程角寸。根據(jù)當(dāng)前的環(huán)境菩混,手動(dòng)配置線程池,減少對(duì)系統(tǒng)資源的浪費(fèi)和擁擠扁藕。用線程池控制線程數(shù)量沮峡,同時(shí)運(yùn)行X個(gè)core線程,其他線程排隊(duì)等候亿柑。一個(gè)工作任務(wù)執(zhí)行完畢之后邢疙,從隊(duì)列前面取一個(gè)再執(zhí)行。若隊(duì)列中沒(méi)有等待線程望薄,線程池資源處于等待狀態(tài)疟游。
2、使用線程池的好處
線程池可根據(jù)系統(tǒng)的承受能力痕支,調(diào)整線程池中工作線程的數(shù)目颁虐,防止OOM或者應(yīng)用卡死。(控制線程數(shù)量卧须,防止消耗完所有的內(nèi)存)如果不使用線程池另绩,線程將會(huì)無(wú)法統(tǒng)一管理,而且每次都在new 新的對(duì)象花嘶,不會(huì)復(fù)用以前new的工作線程笋籽。(減少創(chuàng)建銷毀線程所花的時(shí)間以及系統(tǒng)資源的開(kāi)銷)
3、Java自帶的4種線程池
SingleThreadExecutor
單線程化的Executor察绷,它只會(huì)用唯一的工作線程來(lái)執(zhí)行任務(wù)干签,保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。最大特點(diǎn)是可以保證按照順序執(zhí)行各個(gè)任務(wù)拆撼,不會(huì)有多個(gè)線程是可活動(dòng)的容劳。
ScheduledThreadPool
定長(zhǎng)線程池喘沿,可控制線程最大并發(fā)數(shù),支持定時(shí)及周期性任務(wù)執(zhí)行竭贩,類似于Timer蚜印。
FixedThreadPool
定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù)留量,超出的線程會(huì)在隊(duì)列中等待窄赋。
CachedThreadPool
可緩存的線程池÷ハǎ可創(chuàng)建的最大線程數(shù)量沒(méi)有限制忆绰,如果長(zhǎng)時(shí)間(60秒)沒(méi)有向線程池中提交新任務(wù),該線程會(huì)被終止可岂。
AsyncTask
AsyncTask也是使用線程池來(lái)控制的错敢,是用ThreadPollExecutor,core線程數(shù)量是5缕粹,線程池最大值是128稚茅,也就是說(shuō)最多5個(gè)線程同時(shí)在執(zhí)行,最多128個(gè)任務(wù)在隊(duì)列中排隊(duì)等待平斩。
Timer和ScheduledExecutorService的比較
Timer在執(zhí)行定時(shí)任務(wù)時(shí)只會(huì)創(chuàng)建一個(gè)線程亚享,如果存在多個(gè)任務(wù),任務(wù)耗時(shí)時(shí)間過(guò)長(zhǎng)绘面,會(huì)發(fā)生兩個(gè)任務(wù)執(zhí)行間隔不準(zhǔn)確的情況欺税。ScheduledExecutorService內(nèi)部是線程池,不會(huì)因?yàn)槿蝿?wù)耗時(shí)過(guò)長(zhǎng)而讓其時(shí)間的間隔不正確揭璃。兩個(gè)任務(wù)線程互相不會(huì)干擾魄衅。Timer在執(zhí)行定時(shí)任務(wù)時(shí)候依賴與系統(tǒng)的時(shí)間,比如系統(tǒng)時(shí)間人為的去改變了塘辅,執(zhí)行結(jié)果也會(huì)發(fā)生改變。ScheduledExecutorService是基于時(shí)間的延時(shí)皆撩,不會(huì)依賴與系統(tǒng)時(shí)間改變的扣墩。綜上所述使用ScheduledExecutorService代替Timer比較好。
下面是分享個(gè)自己封裝的一個(gè)線程池管理工具
/**
* @Description: java 線程池使用工具
* @suthor GuoXC
* @date 2016/12/06 11:29
*/
public class ThreadManager {
private ExecutorService cachedThreadService;//可緩存線程池
private ExecutorService fixedThreadService;//定長(zhǎng)線程池
private ScheduledExecutorService scheduledThreadService;//定長(zhǎng)線程池
private ExecutorService singleThreadExecutor;//單線程線程池
private static ThreadManager manager;
private ThreadManager() {
}
/**
* 單例
*
* @return ThreadManager
*/
public synchronized static ThreadManager getInstance() {
if (manager == null) { // 解決效率問(wèn)題
synchronized (ThreadManager.class) {
if (manager == null) {
manager = new ThreadManager();
}
}
}
return manager;
}
/**
* 1,可緩存線程池扛吞,如果線程池長(zhǎng)度超過(guò)處理需要呻惕,可靈活回收空閑線程,若無(wú)可回收滥比,則新建線程亚脆。
*
* @param runnable 線程任務(wù)
*/
public void cachedThread(Runnable runnable) {
if (runnable == null) return;
if (cachedThreadService == null) {
cachedThreadService = Executors.newCachedThreadPool();
}
if (!cachedThreadService.isShutdown() || !cachedThreadService.isTerminated()) {
cachedThreadService.execute(runnable);
} else {
throw new RuntimeException("CachedThreadService is shut down or terminated");
}
}
/**
* 2,定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù)盲泛,超出的線程會(huì)在隊(duì)列中等待濒持。
*
* @param runnable 線程任務(wù)
*/
public void fixedThread(Runnable runnable) {
if (runnable == null) return;
if (fixedThreadService == null) {
fixedThreadService = Executors.newFixedThreadPool(3);
}
if (!fixedThreadService.isTerminated() || !fixedThreadService.isTerminated()) {
fixedThreadService.execute(runnable);
} else {
throw new RuntimeException("FixedThreadService is shut down or terminated");
}
}
/**
* 3.1,定長(zhǎng)線程池键耕,延遲執(zhí)行
*
* @param runnable 線程任務(wù)
* @param delay 延遲 單位 S
*/
public void scheduledThread(Runnable runnable, long delay) {
if (runnable == null) return;
if (scheduledThreadService == null) {
scheduledThreadService = Executors.newScheduledThreadPool(5);
}
if (!scheduledThreadService.isTerminated() || !scheduledThreadService.isShutdown()) {
scheduledThreadService.schedule(runnable, delay, TimeUnit.SECONDS);
} else {
throw new RuntimeException("ScheduledThreadService is shut down or terminated");
}
}
/**
* 3.2,定長(zhǎng)線程池,定期執(zhí)行,可以用來(lái)做定時(shí)器
*
* @param runnable 線程任務(wù)
* @param delay 延遲 單位 S
* @param space 執(zhí)行間隔 單位 S
*/
public void scheduledThread(Runnable runnable, long delay, long space) {
if (runnable == null) return;
if (scheduledThreadService == null) {
scheduledThreadService = Executors.newScheduledThreadPool(2);
}
if (!scheduledThreadService.isShutdown() || !scheduledThreadService.isTerminated()) {
scheduledThreadService.scheduleAtFixedRate(runnable, delay, space, TimeUnit.SECONDS);
} else {
throw new RuntimeException("ScheduledThreadService is shut down or terminated");
}
}
/**
* 4,單線程化的線程池柑营,它只會(huì)用唯一的工作線程來(lái)執(zhí)行任務(wù)屈雄,保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。
*
* @param runnable 線程任務(wù)
*/
public void singleThread(Runnable runnable) {
if (runnable == null) return;
if (singleThreadExecutor == null) {
singleThreadExecutor = Executors.newSingleThreadExecutor();
}
if (!singleThreadExecutor.isShutdown() || !singleThreadExecutor.isTerminated()) {
singleThreadExecutor.execute(runnable);
} else {
throw new RuntimeException("SingleThreadExecutor is shut down or terminated");
}
}
}