参考:https://www.jianshu.com/p/87bff5cc8d8c
https://blog.csdn.net/tuke_tuke/article/details/51353925
线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池可以对线程进行统一的分配、调优和监控,并有以下好处:
ThreadPoolExecutor
Executors是java线程池的工厂类,通过它可以快速初始化一个符合业务需求的线程池,如Executors.newFixedThreadPool
(1)ExecutorService e1= Executors.newCachedThreadPool(); //创建一个缓存线程池,线程池容量大小为Integer.MAX_VALUE
(2)ExecutorService e2= Executors.newSingleThreadExecutor(); //创建容量为1的线程池
(3)ExecutorService e3= Executors.newFixedThreadPool(int); //创建固定容量大小的线程池
向线程池提交任务的两种方式:
1)通过execute()方法
e1.execute(new Runnable(){...})
2)通过submit()方法
Future<?> future = e1.submit(new Runnable(){...});
try {
Object res = future.get();// 获取任务执行结果
} catch (InterruptedException e) {
e.printStackTrace(); //处理中断异常
} catch (ExecutionException e) {
e.printStackTrace();//处理无法执行任务异常
}finally{
executor.shutdown(); //关闭线程池
}
corePoolSize
maximumPoolSize
keepAliveTime
workQueue
1、ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务;
2、LinkedBlockingQuene:基于链表结构的阻塞队列,按FIFO排序任务,吞吐量通常要高于ArrayBlockingQuene
3、SynchronousQuene:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQuene;
4、priorityBlockingQuene:具有优先级的无界阻塞队列;
threadFactory
RejectedExecutionHandler handler
3.线程池中的线程初始化
· prestartCoreThread():初始化一个核心线程;
· prestartAllCoreThreads():初始化所有核心线程
线程池的实现原理
1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。
2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。
