第八章 线程池的使用
摘要: 本章主要介绍了Executor的配置和调优的一些高级选项,并分析使用该框架的一些危险,以及使用该框架的一些高级用例。
8.3 配置和使用策略
前两小节相对比较基础和概念就暂不多说。
线程池的创建除了Executors的各种方法之外,还可以通过构造函数去自定义化自己的线程池。
本节的重点在于任务队列的管理,文中有三个管理方法,第一使用无界队列,第二使用有界队列,第三使用同步移交。那么无界队列的劣势很明显就是无限创建的问题。有界队列是相对比较灵活的方式,首先可以使用PriorityBlockingQueue来决定运行优先权,当队伍满的时候有不同的报和策略。第三个同步移交则是让任务可以不用排队直接对接到工作线程中。
饱和策略: 常用的饱和策略AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy。
Abort: 当发生溢出事件时,抛出RejectedException让调用这cache和处理。
Discard: 直接抛弃新的任务。
DiscardOldest: 抛弃下一个将要执行的任务,那么如果是优先队列的话,他将会抛弃优先级最高的任务。
CallerRuns: 既不抛弃任务也不抛异常,而是在当一个调用了execute的线程中执行。并且在此期间主线程不会调用accept方法使得工作线程有一段儿时间去处理任务。
线程池在创建线程时,都是使用线程工厂方法,我们可以自定义实现工厂方法。
在线程池被创建之后也可以通过一些方法去修改设置来动态的实现最优的线程池。
8.4 递归算法的并行化 -TODO