线程池的作用
- 提升性能:线程池能独立负责线程的创建、维护和分配。主要体现在线程的复用。
- 线程管理:每个Java线程池会保持一些基本的线程统计信息,如完成的任务数量、空闲时间等。
线程池核心类
1、Executor <<接口>>
Executor是执行者接口,它的目标是执行目标任务,使任务提交和任务执行解藕。
2、ExecutorService <<接口>>
继承自Executor。它的目标是对外提供异步任务接收服务并转交给执行者。
3、AbstractExecutorService
实现了ExecutorService接口。他的主要目标是为ExecutorService提供默认实现。
4、ThreadPoolExecutor
继承自AbstractExecutorService。是线程池的核心实现类。
5、ScheduledExecutorService <<接口>>
继承自ExecutorService。它是一个可以完成“延时”和“周期性”任务的调度线程池接口。
6、ScheduledThreadPoolExecutor
继承自ThreadPoolExecutor,提供了ScheduledExecutorService中“延迟”和“周期性”的具体实现。
7、Executors
它是一个静态工厂类,能通过静态方法快捷创建线程池。
任务阻塞队列
- ArrayBlockingQueue
是一个数组实现的有界阻塞队列,队列中的元素按FIFO排序。ArrayBlockingQueue在创建时必须设置大小。
- LinkedBlockingQueue
是一个基于链表实现的阻塞队列,按FIFO排序,可以设置容量,不设置容量默认按Integer.MAX_VALUE作为容量(无界队列)。该队列的吞吐量高于ArrayBlockingQueue。
- PriorityBlockingQueue
是一个具有优先级的队列。
- DelayQueue
是一个无界阻塞延迟队列,底层基于PriorityBlockingQueue实现,队列中每个元素都有过期时间,当从队列中获取元素时,只有过期的元素才会出队。
- SynchronousQueue
同步队列,是一个不存储元素的阻塞队列。SynchronousQueue的每一次put操作,必须等待其他线程的take操作。而每一个take操作也必须等待其他线程的put操作。吞吐量大于LinkedBlockingQueue。