java excutorthread_Java中ThreadPoolExecutor的参数理解
一、使用Executors創(chuàng)建線程池
之前創(chuàng)建線程的時(shí)候都是用的Executors的newFixedThreadPool(),newSingleThreadExecutor(),newCachedThreadPool()這三個(gè)方法。當(dāng)然Executors也是用不同的參數(shù)去new ThreadPoolExecutor
1.?newFixedThreadPool()
創(chuàng)建線程數(shù)固定大小的線程池。 由于使用了LinkedBlockingQueue所以maximumPoolSize 沒用,當(dāng)corePoolSize滿了之后就加入到LinkedBlockingQueue隊(duì)列中。每當(dāng)某個(gè)線程執(zhí)行完成之后就從LinkedBlockingQueue隊(duì)列中取一個(gè)。所以這個(gè)是創(chuàng)建固定大小的線程池。
public?static?ExecutorService?newFixedThreadPool(int?nThreads)?{
return?new?ThreadPoolExecutor(nThreads,?nThreads,
0L,?TimeUnit.MILLISECONDS,
new?LinkedBlockingQueue());
}
public?ThreadPoolExecutor(int?corePoolSize,
int?maximumPoolSize,
long?keepAliveTime,
TimeUnit?unit,
BlockingQueue?workQueue)?{
this(corePoolSize,?maximumPoolSize,?keepAliveTime,?unit,?workQueue,
Executors.defaultThreadFactory(),?defaultHandler);
}
2.newSingleThreadPool()
創(chuàng)建線程數(shù)為1的線程池,由于使用了LinkedBlockingQueue所以maximumPoolSize 沒用,corePoolSize為1表示線程數(shù)大小為1,滿了就放入隊(duì)列中,執(zhí)行完了就從隊(duì)列取一個(gè)。
public?static?ExecutorService?newSingleThreadExecutor()?{
return?new?FinalizableDelegatedExecutorService
(new?ThreadPoolExecutor(1,?1,
0L,?TimeUnit.MILLISECONDS,
new?LinkedBlockingQueue()));
}
3.newCachedThreadPool()
創(chuàng)建可緩沖的線程池。沒有大小限制。由于corePoolSize為0所以任務(wù)會(huì)放入SynchronousQueue隊(duì)列中,SynchronousQueue只能存放大小為1,所以會(huì)立刻新起線程,由于maxumumPoolSize為Integer.MAX_VALUE所以可以認(rèn)為大小為2147483647。受內(nèi)存大小限制。
public?static?ExecutorService?newCachedThreadPool()?{
return?new?ThreadPoolExecutor(0,?Integer.MAX_VALUE,
60L,?TimeUnit.SECONDS,
new?SynchronousQueue());
}
public?ThreadPoolExecutor(int?corePoolSize,
int?maximumPoolSize,
long?keepAliveTime,
TimeUnit?unit,
BlockingQueue?workQueue)?{
this(corePoolSize,?maximumPoolSize,?keepAliveTime,?unit,?workQueue,
Executors.defaultThreadFactory(),?defaultHandler);
}
二、使用ThreadPoolExecutor創(chuàng)建線程池
ThreadPoolExecutor的構(gòu)造函數(shù)
public?ThreadPoolExecutor(int?corePoolSize,
int?maximumPoolSize,
long?keepAliveTime,
TimeUnit?unit,
BlockingQueue?workQueue,
ThreadFactory?threadFactory,
RejectedExecutionHandler?handler)?{
if?(corePoolSize?
maximumPoolSize?<=?0?||
maximumPoolSize?
keepAliveTime?
throw?new?IllegalArgumentException();
if?(workQueue?==?null?||?threadFactory?==?null?||?handler?==?null)
throw?new?NullPointerException();
this.corePoolSize?=?corePoolSize;
this.maximumPoolSize?=?maximumPoolSize;
this.workQueue?=?workQueue;
this.keepAliveTime?=?unit.toNanos(keepAliveTime);
this.threadFactory?=?threadFactory;
this.handler?=?handler;
}
參數(shù):
1、corePoolSize核心線程數(shù)大小,當(dāng)線程數(shù)
2、maximumPoolSize 最大線程數(shù), 當(dāng)線程數(shù) >= corePoolSize的時(shí)候,會(huì)把runnable放入workQueue中
3、keepAliveTime ?保持存活時(shí)間,當(dāng)線程數(shù)大于corePoolSize的空閑線程能保持的最大時(shí)間。
4、unit 時(shí)間單位
5、workQueue 保存任務(wù)的阻塞隊(duì)列
6、threadFactory 創(chuàng)建線程的工廠
7、handler 拒絕策略
任務(wù)執(zhí)行順序:
1、當(dāng)線程數(shù)小于corePoolSize時(shí),創(chuàng)建線程執(zhí)行任務(wù)。
2、當(dāng)線程數(shù)大于等于corePoolSize并且workQueue沒有滿時(shí),放入workQueue中
3、線程數(shù)大于等于corePoolSize并且當(dāng)workQueue滿時(shí),新任務(wù)新建線程運(yùn)行,線程總數(shù)要小于maximumPoolSize
4、當(dāng)線程總數(shù)等于maximumPoolSize并且workQueue滿了的時(shí)候執(zhí)行handler的rejectedExecution。也就是拒絕策略。
ThreadPoolExecutor默認(rèn)有四個(gè)拒絕策略:
1、ThreadPoolExecutor.AbortPolicy() ? 直接拋出異常RejectedExecutionException
2、ThreadPoolExecutor.CallerRunsPolicy()????直接調(diào)用run方法并且阻塞執(zhí)行
3、ThreadPoolExecutor.DiscardPolicy() ? 直接丟棄后來的任務(wù)
4、ThreadPoolExecutor.DiscardOldestPolicy() ?丟棄在隊(duì)列中隊(duì)首的任務(wù)
當(dāng)然可以自己繼承RejectedExecutionHandler來寫拒絕策略.
int?corePoolSize?=?1;
int?maximumPoolSize?=?2;
int?keepAliveTime?=?10;
//BlockingQueue?workQueue?=?new?LinkedBlockingQueue();
BlockingQueue?workQueue?=?new?ArrayBlockingQueue(5);
ThreadFactory?threadFactory?=?Executors.defaultThreadFactory();
//線程池和隊(duì)列滿了之后的處理方式
//1.跑出異常
RejectedExecutionHandler?handler?=?new?ThreadPoolExecutor.AbortPolicy();
RejectedExecutionHandler?handler2?=?new?ThreadPoolExecutor.CallerRunsPolicy();
RejectedExecutionHandler?handler3?=?new?ThreadPoolExecutor.DiscardPolicy();
RejectedExecutionHandler?handler4?=?new?ThreadPoolExecutor.DiscardOldestPolicy();
ThreadPoolExecutor?threadPoolExecutor?=?new?ThreadPoolExecutor(corePoolSize,?maximumPoolSize,?keepAliveTime,?TimeUnit.SECONDS,?workQueue,?threadFactory,?handler2);
for?(int?j?=?1;?j?
threadPoolExecutor.execute(new?Runnable()?{
public?void?run()?{
try?{
System.out.println(Thread.currentThread().getName());
TimeUnit.SECONDS.sleep(1);
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
}
});
}
System.out.println(threadPoolExecutor);
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java excutorthread_Java中ThreadPoolExecutor的参数理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bat kafka启动_windows下
- 下一篇: java 物理内存_聊聊Java中的内存