文章目录
  1. 1. 1. Async异步方法线程池配置
  2. 2. 2. ThreadPoolTaskExecutor类
  3. 3. 3. java.util包中的threadPoolExecutor类

1. Async异步方法线程池配置

1
2
3
4
5
6
7
8
9
10
11
12
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//参数配置
executor.setCorePoolSize(10);
executor.setMaxPoolSize(300);
executor.setQueueCapacity(500);
executor.setThreadPriority(Thread.NORM_PRIORITY);
executor.setThreadNamePrefix("customerAsyncExecutor-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.initialize();
return executor;
}

2. ThreadPoolTaskExecutor类

  • 参数:

    • poolSizeMonitor:用于加锁
    • corePoolSize
    • maxPoolSize
    • keepAliveSeconds
    • queueCapacity
    • allowCoreThreadTimeOut
    • threadPoolExecutor:真正的线程池
  • 参数的get/set方法都加了synchronized关键字,锁住了poolSizeMonitor对象

  • 队列:传入参数大于0,则为LinkedBlockingQueue,否则使用SynchronousQueue,都强制类型转换成BlockingQueue
  • 继承了ExecutorConfigurationSupport类

3. java.util包中的threadPoolExecutor类

  • 线程Size:

    • 线程数小于corePoolSize,直接新建线程
    • 大于corePoolSize,小于maximumPoolSize,队列满时才新建线程
    • prestartCoreThread方法:预先创建线程
  • ThreadPoolFactory创建线程:可修改线程组名称,优先级等

  • Keep-alive:线程数大于corePoolSize,等候超过一定时间后中断线程
  • 队列Queue:

    • SynchronousQueue:无缓冲队列,生产者直到消费者就位才执行,可以避免任务线程互相等待的情况。一般要求maximumPoolSize设置越大越好
    • LinkedBlockingQueue:无界队列,不会有超过corePoolSize数量的线程。适用于线程完全独立的情况,处理瞬态突发请求,Web服务器中常用
    • ArrayBlockingQueue:有界队列,可以控制系统资源消耗,但是需要在队列长度和线程数之间做平衡
  • 拒绝策略Policy:

    • AbortPolicy:抛RejectedExecutionException异常
    • CallerRunsPolicy:提供简单的反馈控制机制,能够减缓新任务的提交速度
    • DiscardPolicy:直接drop任务
    • DiscardOldestPolicy:删除队列头部的任务,重试
  • Hook方法:

    • beforeExecute:初始化ThreadLocal,添加Log信息等
    • afterExecute:统计数据,收尾处理等
  • ctl:为了包装workerCount和runState为一个int,限制任务线程数量为(2^29)-1,大约500百万个线程。后两位保存线程状态

  • 线程池状态:

    • RUNNING:接受新的任务,处理队列任务;
    • SHUTDOWN:不在接受新的任务,处理队列任务;
    • STOP:不在接受新任务,不处理队列任务,中断正在执行的任务线程;
    • TIDYING:所有的任务已经结束,任务线程为0,线程转换到TIDYING;
    • TERMINATED:线程池已将结束,即terminated()方法执行完。
  • 参数:所有用于控制参数被修饰为volatile,以便正在进行的操作都是基于最新值。

文章目录
  1. 1. 1. Async异步方法线程池配置
  2. 2. 2. ThreadPoolTaskExecutor类
  3. 3. 3. java.util包中的threadPoolExecutor类