5个,分别如下
1、newcachedthreadpool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。(线程最大并发数不可控制)
2、newfixedthreadpool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3、newscheduledthreadpool:创建一个定长线程池,支持定时及周期性任务执行。
4、newsinglethreadexecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(fifo, lifo, 优先级)执行。
5、newworkstealingpool:jdk1.8新增,创建持有足够线程的线程池来支持给定的并行级别,并通过使用多个队列,减少竞争,它需要穿一个并行级别的参数,如果不传,则被设定为默认的cpu数量。
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
看看上面几种线程池的实现代码:
1、newcachedthreadpool
2、newfixedthreadpool
3、newscheduledthreadpool
4、newsinglethreadexecutor
可以看出前四种线程池最终都是返回了threadpoolexecutor对象,最后一个返回的forkjoinpool是jdk1.7才新增的。
下面来看一下threadpoolexecutor的构造方法:
再看一下forkjoinpool的构造方法
threadpoolexecutor和forkjoinpool都继承了abstractexecutorservice
重点讲解:
其中比较容易让人误解的是:corepoolsize,maximumpoolsize,workqueue之间关系。
1.当线程池小于corepoolsize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
2.当线程池达到corepoolsize时,新提交任务将被放入workqueue中,等待线程池中任务调度执行
3.当workqueue已满,且maximumpoolsize>corepoolsize时,新提交任务会创建新线程执行任务
4.当提交任务数超过maximumpoolsize时,新提交任务由rejectedexecutionhandler处理
5.当线程池中超过corepoolsize线程,空闲时间达到keepalivetime时,关闭空闲线程
6.当设置allowcorethreadtimeout(true)时,线程池中corepoolsize线程空闲时间达到keepalivetime也将关闭
更多threadpoolexecutor的使用:
那么学会使用threadpoolexecutor的参数后,我们就可以不用局限于最上面那四种线程池,可以按照需要来构建自己的线程池;
executors提供了一个默认的threadfactory,我们可以根据需求是否使用它,或者继承它,或者实现threadfactory接口来自定义线程工厂需求。
可以看出,默认的defaultthreadfactory实现了工厂类生成线程的一些基础设置。
privilegedthreadfactory继承了defaultthreadfactory,它主要是用于创建与当前线程具有相同的权限的新线程。具体源码可以自行查看。
在ehcache的包net.sf.ehcache.util里,有个namedthreadfactory,功能实现和defaultthreadfactory类似,它是直接实现threadfactory接口。
包装runnable,使得线程具有返回值,result可以自定义。
[ 尐鱼儿的qq群:726994578 ] --- [ https://github.com/godmaybelieve ]