带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(1)https://developer.aliyun.com/article/1340067?groupCode=taobaotech
keepAliveTime参数
在构造函数中,keepAliveTime表示线程闲置超时时长。如果线程闲置时间超过该时长,非核心线程就会被回收。如果将allowCoreThreadTimeout设置为true时,核心线程也会超时回收。
timeUnit参数
在构造函数中,timeUnit表示线程闲置超时时长的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)。
blockingQueue参数
在构造函数中,blockingQueue表示任务队列,线程池任务队列的常用实现类有:
- ArrayBlockingQueue :一个数组实现的有界阻塞队列,此队列按照FIFO的原则对元素进行排序,支持公平访问队列。
- LinkedBlockingQueue :一个由链表结构组成的可选有界阻塞队列,如果不指定大小,则使用Integer.MAX-
_VALUE作为队列大小,按照FIFO的原则对元素进行排序。
- PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列,默认情况下采用自然顺序排列,也可以指定Comparator。
- DelayQueue:一个支持延时获取元素的无界阻塞队列,创建元素时可以指定多久以后才能从队列中获取当前元 素,常用于缓存系统设计与定时任务调度等。
- SynchronousQueue:一个不存储元素的阻塞队列。存入操作必须等待获取操作,反之亦然。
- LinkedTransferQueue:一个由链表结构组成的无界阻塞队列,与LinkedBlockingQueue相比多了transfer 和tryTranfer方法,该方法在有消费者等待接收元素时会立即将元素传递给消费者。
- LinkedBlockingDeque:一个由链表结构组成的双端阻塞队列,可以从队列的两端插入和删除元素。
threadFactory参数
在构造函数中,threadFactory表示线程工厂。用于指定为线程池创建新线程的方式,threadFactory可以设置线程名称、线程组、优先级等参数。如通过Google工具包可以设置线程池里的线程名:
1 new ThreadFactoryBuilder().setNameFormat("general-detail-batch-%d").build()
RejectedExecutionHandler参数
在构造函数中,rejectedExecutionHandler表示拒绝策略。当达到最大线程数且队列任务已满时需要执行的拒绝策略,常见的拒绝策略如下:
- ThreadPoolExecutor.AbortPolicy:默认策略,当任务队列满时抛出RejectedExecutionException异常。
- ThreadPoolExecutor.DiscardPolicy:丢弃掉不能执行的新任务,不抛任何异常。
- ThreadPoolExecutor.CallerRunsPolicy:当任务队列满时使用调用者的线程直接执行该任务。
- ThreadPoolExecutor.DiscardOldestPolicy:当任务队列满时丢弃阻塞队列头部的任务(即最老的任务), 然后添加当前任务。
线程池状态转移图
ThreadPoolExecutor线程池有如下几种状态:
- RUNNING:运行状态,接受新任务,持续处理任务队列里的任务;
- SHUTDOWN:不再接受新任务,但要处理任务队列里的任务;
- STOP:不再接受新任务,不再处理任务队列里的任务,中断正在进行中的任务;
- TIDYING:表示线程池正在停止运作,中止所有任务,销毁所有工作线程,当线程池执行terminated()方法时进入TIDYING状态;
- TERMINATED:表示线程池已停止运作,所有工作线程已被销毁,所有任务已被清空或执行完毕,terminat ed()方法执行完成;
带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(3)https://developer.aliyun.com/article/1340066?groupCode=taobaotech