一、前言二、原理的简单介绍三、简单使用四、阻塞队列五、参考链接
一、前言 Java线程池是处理高并发,优化使用效率的一个工具,这里对其进行一个简单的记录。
二、原理的简单介绍 线程池一般由核心线程数、最大线程数、空闲时间、空闲时间单位、阻塞队列、拒绝策略组成。其执行过程为当添加一个线程后,若核心线程数不满时候,则创建一个核心线程进行运行,若核心线程池满了则加入阻塞队列,如果阻塞队列满了,这时候就会判断最大线程数是否已经达到最大,如果没有达到最大则创建新的线程,如果达到最大则执行拒绝策略。当最大线程数中的线程执行完任务后会从阻塞队列取出任务进行执行。倘若阻塞队列没有任务则会空闲一定的时间后进行销毁。需要注意的是默认情况下空闲时间不会参与核心线程数中的线程,默认情况下核心线程不会销毁,除非进行额外配置。
三、简单使用 线程池一般由两种创建方式,一种是使用Executors进行创建,这是java提供的一个工具类。另外一个就是使用ThreadPoolExecutor进行自定义配置。示例如下:
Executors
val executors = Executors.newCachedThreadPool() // val executors = Executors.newFixedThreadPool(2) // val executors = Executors.newSingleThreadExecutor()
这三个线程池的含义如下:
newCachedThreadPool: 缓存线程池。核心线程数为0,可以实现最大并发,适用于执行短期频繁运行的任务
newFixedThreadPool: 创建一个固定大小的线程池,超过可以放在阻塞队列中等待。
newSingleThreadExecutor: 单例线程池,只有一个线程的线程池,超过则会添加进阻塞队列,按照后进先出或者先进先出方式执行
ThreadPoolExecutor:
val cacheThreadPool = ThreadPoolExecutor(
0, Int.MAX_VALUE,
60L, TimeUnit.SECONDS,
SynchronousQueue(),
ThreadPoolExecutor.AbortPolicy()//拒绝策略可选,不写的话使用默认的策略
)
添加线程的方式为:
executors.submit {
println("========")
}
executors.execute {
println("++++")
}
ExecutorService::submit(Runnable task)和ExecutorService::execute(Runnable task)都可以添加线程,区别在于execute(Runnable task)没有返回值,submit(Runnable task)的返回值为Future,该类可以对线程做进一步控制。
四、阻塞队列 在线程池的使用中阻塞队列是一个重要的概念,阻塞队列决定了线程池中线程的执行顺序。阻塞队列常用的有以下几种:
ArrayBlockingQueue: 有界队列。阻塞队列有大小
linkedBlockingQueue: 无界队列。该阻塞队列不设大小
SynchronousQueue: 没有大小的队列,队列中没有任何大小,线程不能添加到这里,可以理解为直接跳过阻塞队列执行下一步
五、参考链接- java并发编程:Executor、Executors、ExecutorServicejava多线程:线程池原理、阻塞队列线程池中的阻塞队列选择添加链接描述



