目录
三、使用ScheduledThreadPoolExecutor类创建线程池
一、使用Executors工具类创建线程池
在创建线程池时,初学者用得最多的就是Executors这个工具类,而使用这个工具类创建线程池是非常简单的,不需要关注太多的线程池细节,只需要传入必要的参数即可。Executors工具类提供了几种创建线程池的方法,如下所示。
- Executors.newCachedThreadPool:创建一个可缓存的线程池,如果线程池的大小超过了需要,可以灵活回收空闲线程,如果没有可回收线程,则新建线程
- Executors.newFixedThreadPool:创建一个定长的线程池,可以控制线程的最大并发数,超出的线程会在队列中等待
- Executors.newScheduledThreadPool:创建一个定长的线程池,支持定时、周期性的任务执行
- Executors.newSingleThreadExecutor:创建一个单线程化的线程池,使用一个唯一的工作线程执行任务,保证所有任务按照指定顺序(先入先出或者优先级)执行
- Executors.newSingleThreadScheduledExecutor:创建一个单线程化的线程池,支持定时、周期性的任务执行
- Executors.newWorkStealingPool:创建一个具有并行级别的work-stealing线程池
我们可以使用如下代码创建线程池:
Executors.newWorkStealingPool();
Executors.newCachedThreadPool();
Executors.newScheduledThreadPool(3);
二、使用ForkJoinPool类创建线程池
在Java8的Executor工具类中,新增了调用ForkJoinPool类的构造方法类创建线程池,从代码结构上来看ForkJoinPool类继承自AbstractExecutorService抽象类,通过查看源码,ForkJoinPool的构造方法,最终调用的都是如下的私有构造方法。
private ForkJoinPool ( int parallelism,
ForkJoinWorkerThreadFactory factory,
UncaughtExceptionHandler handler,
int mode,
String workerNamePrefix ){
this.workerNamePrefix = workerNamePrefix;
this.factory = factory;
this.ueh = hanlder;
this.config = (parallelism & SMASK) / mode;
long np = (long)(-parallelism); //offset ctl counts
this.ctl = ((np << AC_SHIFT)& AC_MASK)|
((np <<TC_SHIFT)& TC_MASK);
}
当然,私有构造方法虽然是参数最多的一个方法,但是其不会直接对外的方法,我们可以使用如下方式创建线程池。
new ForkJoinPool);
new ForkJoinPool(Runtime.getRuntime()
.availableProcessors());
new ForkJoinPool(Runtime.getRuntime()
.availableProcessors),
ForkJoinPool
.defaultForkJoinWorkerThreadFactory,
null, true);
三、使用ScheduledThreadPoolExecutor类创建线程池
ScheduledThreadPoolExecutor类继承自ThreadPoolExecutor类,本质上还是调用ThreadPoolExecutor类的构造方法,只不过此时传递的队列为DelayedWorkQueue。我们可以直接调用ScheduledThreadPoolExecutor类的构造方法来创建线程池,例如以如下形式创建线程池。
new ScheduledThreadPoolExecutor(3); 最后,需要注意的是:
ScheduledThreadPoolExecutor主要用来创建执行定时任务的线程池。
总结
该文章介绍了一些线程池的创建方式,本文整理自leyibaby博主的相关内容。