
Executor框架为置顶和修改执行策略听歌了很大的灵活性,但并非所有的任务都能适合所有的执行策略
- 依赖性任务
如果提交给线程池的任务需要以来其他的任务,那么就隐含地给执行策略带来了约束,此时需要维持执行策略以免产生跳跃性的问题 - 使用线程封闭机制的任务
任务要求其执行所在的Exeutor是单线程的。 - 对响应时间敏感的任务
- 使用ThreadLocal任务
只有当线程本地值的生命受限于任务色声明周期时,在线程池中使用ThreadLocal才有意义,而在线程池的线程中不应该使用ThradLocal在任务之间传递值。
线程饥饿死锁
在线程池中,如果任务依赖于其他任务,则可能产生死锁
执行时间较长的任务
设置线程池的大小
计算密集型线程 = cpu数量+1
I/O 密集型线程数更大些
配置ThreadPoolExecutor
一个 ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置。
线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。
为了便于跨大量上下文使用,此类提供了很多可调整的参数和扩展钩子 (hook)。但是,强烈建议程序员使用较为方便的 Executors 工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、Executors.newFixedThreadPool(int)(固定大小线程池)和 Executors.newSingleThreadExecutor()(单个后台线程),它们均为大多数使用场景预定义了设置。否则,在手动配置和调整此类时,使用以下指导:




近期评论