池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。
1、使用线程池的好处
- 降低资源的消耗:通过重复利用以创建的线程降低线程创建和销毁造成的损耗。
- 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。
2、线程池的主要处理流程
线程池的主要处理流程
3、创建线程池时的几个参数
ThreadPoolExecutor源码
- corePoolSize(核心线程数):最小可以同时运行的线程数量。如果调用了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有基本线程。
- maximumPoolSize(线程池最大数量):线程池允许创建的最大线程数。如果队列满了,并且以创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。注意!如果使用了无界的任务队列这个参数就没什么效果,因为队列不满,不会创建额外的线程。
- keepAliveTime(线程活动保持时间):当线程池中的线程数量大于 corePoolSize 的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了keepAliveTime才会被回收销毁。
- unit(keepAliveTime的单位):可选天、小时、分钟、毫秒。
-
workQueue(任务队列):当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。有以下几种队列:
(1)ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按FIFO排序元素。
(2)LinkedBlockingQueue:是一个基于链表的有界阻塞队列,此队列按FIFO排序元素。
(3)SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。
(4)PriorityBlockingQueue:是一个支持优先级的无界阻塞队列。默认情况下元素采取自然顺序升序排列,但需要注意的是不能保证同优先级元素的顺序。PriorityBlockingQueue是基于最小二叉堆实现。 - threadFactory(线程工厂):可以通过线程工厂给每个创建出来的线程设置更有意义的名字。
- handler(饱和策略):当队列和线程池都满了时采取的策略。默认是AbortPolicy。
(1)AbortPolicy:抛出异常,拒绝新任务的处理。
(2)CallerRunsPolicy:调用执行自己的线程运行任务。
(3)DiscardPolicy:不处理新任务,直接丢弃掉。
(4)DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行新任务