Java线程池的基本用法(2020年9月21日

在这里插入图片描述

基本使用

Executors创建线程池

通常使用线程池是应用jdk所提供的Executors类中的静态方法即可获取ExecutorService对象应用相关方法调度线程进行工作;

方法名 功能 具体情况
Executors.newCachedThreadPool() 创建一个带缓存的线程池 若已创建出来的线程可供使用则复用,否则会新建线程来提供服务,没有线程创建的上限。
Executors.newFixedThreadPool(10) 创建一个指定线程数量的线程池 核心线程数和最大线程数皆为指定参数,当没有线程可供提供服务则进入阻塞队列,当阻塞队列满后会触发相关的拒绝策略
Executors.newSingleThreadExecutor() 创建只有一个线程的线程池 线程空闲则服务,否则进入无界阻塞队列进行顺序执行

自定义参数创建线程池

Executors中创建的线程池的办法,其底层实现还是调用了ThreadPoolExecutor的构造方法,而定时任务线程池中调用的是newScheduledThreadPool的构造方法.,该类的全参构造函数如下jdk1.8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public ThreadPoolExecutor(int corePoolSize,  // 核心线程数 即使空闲 也不会被回收
int maximumPoolSize, // 最大线程数量
long keepAliveTime, // 超过corePoolSize的线程空闲回收时长 超过这个值 将会被回收
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.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();   
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}

一般自定义的线程池主要看中的参数有:

  • corePoolSize 核心线程数量
  • maximumPoolSize 最大线程数量
  • workQueue 任务的等待队列
  • handler 拒绝策略

线程池的工作顺序

当一个新任务添加到线程池中,首先会判断当前使用的线程数与核心线程数的大小关系,若有核心线程空闲,则核心线程提供服务。 当所有核心线程均有任务时,此时会优先将任务添加到等待队列。当等待队列也满的时候,则会创建新的线程提供服务。当现在运行线程已到达最大线程数且等待队列也是满的情况,则应用相关的拒绝策略对当前任务进行拒绝。

图片描述
在这里插入图片描述

-------------本文结束,感谢您的阅读!-------------