Loading

Java并发之任务和执行策略之间的隐形耦合

一.一些特殊的任务

我们知道Executor框架可以将任务的提交与任务的执行策略解耦开来,虽然Executor框架为制定和修改执行策略都提供了相当大的灵活性,但并非所有任务都能适用于所有的执行策略。
1.一些特殊类型的任务需要明确的指定执行策略:

1).依赖性任务。 如果提交给线程池的任务需要依赖其他的任务,那么就隐含地给执行策略带来了约束,此时必须小心地维持这些执行策略以避免产生活跃性问题(死锁等问题)。

2).使用线程封闭机制的任务。 对象封闭在任务线程中,使得该线程中执行的任务在访问该对象时不需要同步,即使这些资源不是线程安全的也没有问题。这种情形将在任务与执行策略之间形成隐式的耦合—任务要求其执行所在的Executor是单线程的。如果将Executor从单线程环境改为线程池的环境,那么将会失去线程安全性。

3).对响应时间敏感的任务。 GUI程序对响应时间是敏感的,它对点击按钮后的及时响应的要求很高,如果将一个运行时间较长的任务提交到单线程的Executor中,或者将多个运行时间较长的任务提交到一个只包含少量线程的线程池中,那么将降低由该Executor管理的服务的响应性。

4).使用ThreadLocal的任务。 只有当线程本地值的生命周期受限于任务的生命周期时,在线程池的线程使用ThreadLocal才有意义,而在线程池的线程中不应该使用ThreadLocal在任务之间传递值。

注意:只有当任务都是同类型的并且相互独立时,线程池的性能才能达到最佳。在一些任务中,需要拥有或排除某种特定的执行策略。如果某些任务依赖于其他的任务,那么会要求线程池足够大&#x

posted @ 2020-11-27 09:41  文牧之  阅读(16)  评论(0)    收藏  举报  来源