问题:
饥饿死锁:当前任务依赖后续任务完成,但是后续任务没有资源。比如单线程池里面的资源等待下一个任务的执行结果。
运行时间较长:长时间的任务先执行,导致后续任务一直等待
解决
问题一:
合理设置线程池大小。预先判断任务之间的依赖关系。保证依赖任务都可以得到执行。
问题二:
合理安排线程池里的任务,一个简单解决方法是将任务分类。
合理设置线程池大小:
线程池数 = cpu数量*cpu使用率*(1 + 等待时间/计算时间)
配置threadpoolexecutor
maximumpoolsize 最大线程数
keepalivetime 线程执行时间
timeunit 时间单位
workqueue 等待队列
threadfactory 线程工厂
rejectexecutionhandler 决绝策略
线程工厂:
设置threadpoolexecutor
调用set方法
扩展:threadpoolexecutor
beforExecutor
afterExecutor
terminated
递归算法并行化:
递归过程中每一次调用都提交给新的进程执行。
例子:
抽象模型
遍历一个对象(树)
答案可能在树的摸一个节点:遍历过程是一次递归调用。
查看一个节点作为一个独立任务。在递归遍历树的过程中将每一个节点的计算任务交给一个进程执行。
避免无限循环需要一个结束标志:创建一个闭锁。线程安全的变量
存储所有任务执行记录,当没有任务执行之后则退出;