创建线程池的方式(上)

目录

文章目录

一、使用Executors工具类创建线程池

二、使用ForkJoinPool类创建线程池

三、使用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博主的相关内容。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值