第二部分 结构化并发应用程序
java并发编程实战-第6章-任务执行
6.1 在线程中执行任务
当围绕”任务执行“来设计应用程序结构时,第一步就是找出清晰的任务边界。理想情况下,任务之间是
相互独立的
吞吐率和相应时间的选择:当用户希望尽快的相应,而负载过多时,应用性能应该逐步减低
6.2 Excutor框架
java 类库中,任务执行的主要抽象不是Thread,而是Executor
这是基于生产者-消费者模式的一种设计
6.2.1 示例 基于Excutor的web服务器
6.2.2 执行策略
各种执行策略,都是一种资源管理工具。
6.2.3 线程池
newFixedThreadPool
newCachedThreadPool
newSingleThreadExecutor(FIFO, LIFO, priority order).[
newScheduledThreadPool
6.2.4 Executor 生命周期
Listing 6.7. Lifecycle Methods in ExecutorService.
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
// ... additional convenience methods for task submission
}
three states running, shutting down, and terminated
6.2.5 延迟任务和周期任务
Timer是单线程的,应该用ScheduledThreadPoolExecutor替换它
构建自己的ScheduledThreadPoolExecutor,可使用DelayQueue
6.3 需找可以用的并行性
6.3.2 携带结果的任务Callable与Future
6.3.3 示例:使用Future实现页面渲染器
6.3.4 在异构任务并行化存在的缺陷
6.3.5 CompletionService: Executor Meets BlockingQueue
CompletionService把Executor和BlockingQueue的功能融合在一起
6.3.6 使用CompletionService实现页面渲染
图像下载后,放入BlockingQueue队列中,take从BlockingQueue去封装
6.3.7 为任务设置时限
6.3.8 示例:旅行预订门户网站
小结:
Excutor框架的介绍和任务边界定义的观点