线程池的作用

  1. 提升性能:线程池能独立负责线程的创建、维护和分配。主要体现在线程的复用。
  2. 线程管理:每个Java线程池会保持一些基本的线程统计信息,如完成的任务数量、空闲时间等。

线程池核心类

1、Executor <<接口>>

Executor是执行者接口,它的目标是执行目标任务,使任务提交和任务执行解藕。

2、ExecutorService <<接口>>

继承自Executor。它的目标是对外提供异步任务接收服务并转交给执行者。

3、AbstractExecutorService

实现了ExecutorService接口。他的主要目标是为ExecutorService提供默认实现。

4、ThreadPoolExecutor

继承自AbstractExecutorService。是线程池的核心实现类。

5、ScheduledExecutorService <<接口>>

继承自ExecutorService。它是一个可以完成“延时”和“周期性”任务的调度线程池接口。

6、ScheduledThreadPoolExecutor

继承自ThreadPoolExecutor,提供了ScheduledExecutorService中“延迟”和“周期性”的具体实现。

7、Executors

它是一个静态工厂类,能通过静态方法快捷创建线程池。

任务阻塞队列

  1. ArrayBlockingQueue

是一个数组实现的有界阻塞队列,队列中的元素按FIFO排序。ArrayBlockingQueue在创建时必须设置大小。

  1. LinkedBlockingQueue

是一个基于链表实现的阻塞队列,按FIFO排序,可以设置容量,不设置容量默认按Integer.MAX_VALUE作为容量(无界队列)。该队列的吞吐量高于ArrayBlockingQueue。

  1. PriorityBlockingQueue

是一个具有优先级的队列。

  1. DelayQueue

是一个无界阻塞延迟队列,底层基于PriorityBlockingQueue实现,队列中每个元素都有过期时间,当从队列中获取元素时,只有过期的元素才会出队。

  1. SynchronousQueue

同步队列,是一个不存储元素的阻塞队列。SynchronousQueue的每一次put操作,必须等待其他线程的take操作。而每一个take操作也必须等待其他线程的put操作。吞吐量大于LinkedBlockingQueue。