线程池创建的4种方式与参数详解

一、Executors工具类
Executors 是 Executor 的工具类,提供了4种创建不同线程池的方式,来满足业务的需求。底层是调ThreadPoolExecutor类构造方法。

二、Executors中线程池创建的4种方式
newFixedThreadPool:创建的是定长的线程池,可以控制线程最大并发数,超出的线程会在线程队列中等待,使用的是无界队列,核心线程数和最大线程数一样,当线程池中的线程没有任务时候立刻销毁,使用默认线程工厂。

newSingleThreadExecutor:创建的是单线程化的线程池,只会用唯一一个工作线程执行任务,可以指定按照是否是先入先出,还是优先级来执行任务。同样使用无界队列,核心线程数和最大线程数都是1个,同样keepAliveTime为0,可选择是否使用默认线程工厂。

newCachedThreadPool:设定一个可缓存的线程池,当线程池长度超过处理的需要,可以灵活回收空闲线程,如果没有可以回收的才新建线程。没有核心线程数,当线程没有任务60s之后就会回收空闲线程,使用有界队列。同样可以选择是否使用默认线程工厂。

newScheduledThreadPool:支持线程定时操作和周期性操作。

三、ThreadPoolExecutor对线程池的实现
Executors工具类创建线程池底层是调ThreadPoolExecutor构造方法。
1、ThreadPoolExecutor4个创建线程池的构造方法:

public class ThreadPoolExecutor extends AbstractExecutorService{
//第一个构造方法
public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
//第二个构造方法
public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             threadFactory, defaultHandler);
    }
//第三个构造方法
public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              RejectedExecutionHandler handler) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), handler);
    }
//第四个也是真正的初始化构造函数
public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            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;
    }
}

2、参数详解
corePoolSize:核心线程数量。当线程数少于corePoolSize的时候,直接创建新的线程,尽管其他线程是空闲的。当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中。

maximunPoolSize:线程池最大线程数。只有在缓冲队列满了之后才会申请超过核心线程数的线程。当线程数量大于最大线程数且阻塞队列满了这时候就会执行一些策略来响应该线程。

workQueue:阻塞队列。存储等待执行的任务,会对线程池的运行产生很大的影响。当提交一个新的任务到线程池的时候,线程池会根据当前线程数量来选择不同的处理方式。

keepAliveTime:允许线程的空闲时间。当超过了核心线程数之外的线程在空闲时间到达之后会被销毁。

unit:keepAliveTime的时间单位。

threadFactory:线程工厂。用来创建线程,当使用默认的线程工厂创建线程的时候,会使得线程具有相同优先级,并且设置了守护性,同时也设置线程名称。

handler:拒绝策略。当workQueue满了,并且没有空闲的线程数,即线程达到最大线程数。就会有四种不同策略来处理

直接抛出异常(默认)
使用调用者所在线程执行任务
丢弃队列中最靠前的任务,并执行当前任务
直接丢弃当前任务

线程池的关闭

线程池提供了两个关闭方法,shutdownNow和shuwdown方法。

shutdownNow方法的解释是:线程池拒接收新提交的任务,同时立马关闭线程池,线程池里的任务不再执行。

shutdown方法的解释是:线程池拒接收新提交的任务,同时等待线程池里的任务执行完毕后关闭线程池。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池是一常用的并发编程技术,是一组维护线程的池子,用于执行多个并发任务,以提高应用程序的性能和可伸缩性。线程池有多实现方式,其中最常见的包括以下四种: 1. FixedThreadPool:该线程池包含固定数量的线程,当线程池中所有线程均在忙碌状态时,新任务会被放入队列中等待。该线程池的核心参数线程池的大小,即线程池中最多可以同时存在的线程数量。如果线程池中的线程数量已经达到最大值,新任务将会被阻塞,直到有线程空闲出来。 2. CachedThreadPool:该线程池可以根据需要创建新线程,但会在之后回收线程。这线程池适用于处理许多短暂的异步任务。线程池的核心参数线程池的最大大小,即线程池中最多可以同时存在的线程数量。如果线程池中的线程数量已经达到最大值,新任务将会被放入队列中等待。 3. SingleThreadPool:该线程池只包含一个线程,会顺序地执行所有任务。如果该线程异常退出,那么会创建一个新的线程来代替它。该线程池的核心参数线程池的大小,即线程池中最多可以同时存在的线程数量。 4. ScheduledThreadPool:该线程池用于执行定期执行的任务,例如定时器。该线程池的核心参数线程池的大小,即线程池中最多可以同时存在的线程数量。 以上四种线程池参数如下: 1. FixedThreadPool:线程池大小; 2. CachedThreadPool:最大线程池大小; 3. SingleThreadPool:线程池大小; 4. ScheduledThreadPool:线程池大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值