一,为什么要使用线程池
池化技术现在已经应用的很广法了,数据库连接池,Http连接池,线程池等等都是该思想的应用,它的核心目的就是减少资源消耗,提高资源的利用率。
使用线程池的好处:
Exector框架
Exector框架不仅包括了线程池的管理,还提供了线程工厂,队列以及拒绝策略等,Exector框架让并发编程变得更加简单。而且还能避免this逃逸问题。
Executor框架结构
Executor框架主要有三大部分组成(任务,任务的执行,异步计算的结果)下面我们将详细介绍一下。
任务(Runable、Callable)
执行任务需要实现的Runable接口或Callable接口,他俩的实现类都可以被ThreadPoolExector或者ScheduledThreadPoolExecutor执行、
任务的执行(Executor)
包含任务执行机制的核心接口Executor,以及继承自该皆苦的ExecutorService接口。ThreadPoolExecutor和ScheduledThreadPool这两个关键类都实现了ExecutorService接口。
注意:通过查看ScheduledThreadPoolExecutor源代码我们发现其实它实际上是继承了ThreadPoolExecutor并实现了ScheduledExecutorService,而ScheduledExecutorSerivice又实现了ExecutorService.
异步计算的结果(Future)
Future接口以及Future接口的实现类FutureTask类都可以代表异步计算的结果。
当我们把Runable或Callable接口的实现类提交给ThreadPoolExecutor或ScheduledThreadPoolExecutor执行。调用Sumit方法时会返回一个FutureTask对象。
其具体如下:
ThreadPoolExecutor类简单介绍
ThreadPoolExecutor中三个重要参数
ThreadPoolExecutor其他常见参数:
拒绝策略:
如果当前同时运行的线程数量达到最大线程数,并且队列中已经放满任务的时候,那么就会使用拒绝策略、
为什么推荐使用THreadPoolExecutor构造函数创建线程池。
Executors返回线程池对象的弊端如下:
CachedThreadPool,ScheduledThreadPool:允许创建的线程数量未Integer.MAX_VALUE,可能会创建大量线程,从而导致OOM
FixedThreadPool,SingleThreadExecutor:允许队列长度未Inter.MAX_VALUE,可能堆积大量请求,从而导致OOM。