java并发编程:线程池的使用

488 阅读1分钟

问题:

饥饿死锁:当前任务依赖后续任务完成,但是后续任务没有资源。比如单线程池里面的资源等待下一个任务的执行结果。

运行时间较长:长时间的任务先执行,导致后续任务一直等待

解决

问题一:

合理设置线程池大小。预先判断任务之间的依赖关系。保证依赖任务都可以得到执行。

问题二:

合理安排线程池里的任务,一个简单解决方法是将任务分类。

合理设置线程池大小:

线程池数 = cpu数量*cpu使用率*(1 + 等待时间/计算时间)

配置threadpoolexecutor

corepoolsize 核心线程数
maximumpoolsize 最大线程数
keepalivetime 线程执行时间
timeunit 时间单位
workqueue 等待队列
threadfactory 线程工厂
rejectexecutionhandler 决绝策略
线程工厂:

设置threadpoolexecutor

调用set方法

扩展:threadpoolexecutor

beforExecutor

afterExecutor

terminated

递归算法并行化:

递归过程中每一次调用都提交给新的进程执行。

例子:

抽象模型 遍历一个对象(树)
答案可能在树的摸一个节点:遍历过程是一次递归调用。
查看一个节点作为一个独立任务。在递归遍历树的过程中将每一个节点的计算任务交给一个进程执行。
避免无限循环需要一个结束标志:创建一个闭锁。线程安全的变量

为了避免找不到答案的无限循环:
存储所有任务执行记录,当没有任务执行之后则退出;

设置时间长度,超过时间限制则退出。