天天看点

java.util.concurrent.Executors类的常用方法介绍

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

java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍

4、newsinglethreadexecutor

java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍

可以看出前四种线程池最终都是返回了threadpoolexecutor对象,最后一个返回的forkjoinpool是jdk1.7才新增的。

下面来看一下threadpoolexecutor的构造方法:

java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍

再看一下forkjoinpool的构造方法

java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍

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接口来自定义线程工厂需求。

java.util.concurrent.Executors类的常用方法介绍
java.util.concurrent.Executors类的常用方法介绍

可以看出,默认的defaultthreadfactory实现了工厂类生成线程的一些基础设置。

privilegedthreadfactory继承了defaultthreadfactory,它主要是用于创建与当前线程具有相同的权限的新线程。具体源码可以自行查看。

在ehcache的包net.sf.ehcache.util里,有个namedthreadfactory,功能实现和defaultthreadfactory类似,它是直接实现threadfactory接口。

包装runnable,使得线程具有返回值,result可以自定义。

[ 尐鱼儿的qq群:726994578 ] --- [ https://github.com/godmaybelieve ]