线程池(这里使用的JDK自带的ThreadPoolExecutor

代码如下:

1
2
3
4
5
6
7
8
9
10
11
public class Main {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
4,7,15, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
threadPoolExecutor.execute(()->{
System.out.println("你好");
});
}
}

1. corePoolSize参数

这个参数定义的是线程中的核心线程数,也就是在无任务时最小存在线程数(如果没有给核心线程设置过期时间)。
注意,核心线程在一开始是没有的,需要根据根据传入的任务进行生成(核心线程默认是懒加载的,可以进行设置创建时进行加载)。

2. maximumPoolSize参数

这个参数时最大线程数,也就是线程池中能达到的最多线程数(核心线程加非核心线程)。
如果传入的任务数在任务队列中满了。就会开始创建非核心线程,直到核心线程加非核心线程总数等于最大线程数。

3. keepAliveTime参数

这个参数是非核心线程的存活时间。
对于执行完成任务后,非核心线程会在这个时间后进行销毁,目的就是减少资源的消耗。

4. unit参数

这个参数表述的非核心线程的存活时间的单位。

5. workQueue参数

这个参数是存放任务的阻塞队列,用于存放核心线程不能立刻进行执行的任务。

6. threadFactory参数

这个参数是线程工厂,用于创建线程次中的线程。

7. handler参数

这个参数是线程池的拒绝策略,当线程池同时满足以下两个条件时,新提交的任务就会被拒绝:

  • 线程池的核心线程数、最大线程数都已用完(线程池达到饱和);
  • 任务队列也已经满了,无法再接收新任务。

在JDK中提供了4种拒绝策略:

  1. AbortPolicy:直接抛出 RejectedExecutionException 异常,拒绝接收任务。
  2. CallerRunsPolicy:不抛异常、不丢任务,而是让提交任务的线程自己执行这个任务。
  3. DiscardOldestPolicy:丢弃任务队列中最旧的任务(队列头部的任务),然后尝试将新任务加入队列。
  4. DiscardPolicy:静默丢弃新提交的任务,既不抛异常,也不执行任务。