“池”,就是一个工厂,会提早生产出一些东西供使用。因此线程池就是处理多线程的一种方式。
其做用就在于:复用已有资源,控制资源总量多线程
若是不使用线程池,那么:
(1)使用单线程,可是这种方式吞吐量很是低,且请求量一大效率就会显得很是低。
(2)那若是对于每一个请求都开一个线程去处理,这样一旦请求量过大的时候,线程的建立和销毁都要花费时间,而且线程自己也要占用必定的内存。线程
使用线程池后,既能够解决单线程低吞吐量和响应慢的问题,又解决了为每个请求建立线程所耗费的资源问题。code
线程池经过限制线程的数量,可使线程数维持在一个合理的数量,充分发挥了CPU的做用。队列
并且,线程池遵循了生产者消费者模式,将任务的建立和执行解耦。内存
public class ThreadPoolExecutor extends AbstractExecutorService { public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler); }
这里是ThreadPoolExecutor最重要的一个构造方法
(1)corePoolSize : 线程池中维护线程的最少数量
当线程数少于corePoolSize时,就建立一条新的任务,无论是否有空闲的线程。资源
(2)maximumPoolSize: 线程池中维护线程的最大数量
当线程数到达corePoolSize,而且都不空闲,那么新任务都放到任务队列中去。当任务队列放满以后,若是线程数小于maximumPoolSize,就继续建立新线程。同步
(3)keepAliveTime:线程池维护线程所容许的空闲时间
若是线程空闲的时间超过keepAliveTime,那么就撤销它。it
(4)unit: 线程池维护线程所容许的空闲时间的单位io
(5)workQueue: 线程池所使用的缓冲队列
通常采用阻塞队列,有不少种:
无界阻塞队列、有界阻塞队列、同步移交队列class
(6)handler: 线程池对拒绝任务的处理策略
AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
DiscardPolicy:也是丢弃任务,可是不抛出异常。
DiscardOldestPolicy:丢弃队列最前面的任务,而后从新尝试执行任务(重复此过程)
CallerRunsPolicy:由调用线程处理该任务
一、CachedThreadPool
先查看有没有可用的线程,没有再建立新线程
二、FixedThreadPool
与上一种差很少,可是不容许随时建立新线程
任意时间点,最多只能有固定数目的活动线程存在,此时若是有新的线程要创建,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子。
三、ScheduledThreadPool
这个池子里的线程能够按 schedule 依次 delay 执行,或周期执行
四、SingleThreadExecutor任意时间内池子里只能有一个线程。