本章强调以任务为核心,以任务的维度来理解多线程。任务分钟,runnable,callable.executre代表了任务的执行,future代表了任务生命周期的管理。
6.1在线程中执行任务
6.1.1顺序执行任务
6.1.2显式地位任务生成一个新的线程
6.1.3无限制线程创建的缺点
6.2Executor框架
6.2.1例子:使用Executor的WebServer
6.2.2执行策略。what,where,when,how
6.2.3线程池
6.2.4Executor的生命周期
6.2.5延期和周期任务
6.3寻找可利用的并行性
6.3.1线性页面渲染器
6.3.2产生结果的任务:Callable和Future
Runnable和Callable都描述了抽象的计算任务。
而Future代表了任务的生命周期,它提供了一下方法:测试任务是否完成或是否取消;获取任务结果;取消任务。
6.3.3通过Futrue的页面渲染器
6.3.4并行异种任务的限制
6.3.5CompletionService:当Executor遇到BlockingQueue
6.3.6例子:用CompletiionService渲染页面
6.3.7向任务中放置时间限制
6.3.8例子:一个旅行(房间)预订的门户(系统)(通过ExcutorService 的invoke al方法,时限l)
总结:
围绕任务的执行组织应用能够简化开发和促进并行。Executor框架能够允许开发者将任务的提交和执行策略解耦,同时能够支持大量的执行策略;一旦你发现自己在生成线程来执行任务,都要考虑使用Executor来替代。将应用分解成多任务,为了最大化这种方法的收益,你必须确认合理任务的边界。在一些应用中,可以很明显地发现任务边界,其他情况下,你就需要做一些分析来揭示更细粒度的可开发的并行性.
本章中用到17个例子,从Listing6.1到Listing6.17
Listing6.1 顺序执行请求的web服务器,由于不好的吞吐量和响应灵敏度,从反方面证明了并行执行的必要性
Listing6.2采用一个请求一个线程方式的web服务器,对于6.1是一个大的提升。但由于服务器产生线程的有限性,这是一个大的缺陷。
这两个例子都在6.1节。都是为了引入Java5的Executor框架
Listing6.3知识Exeutor接口的介绍
Listing6.4就是一个使用线程池的web服务器的例子。使用了Executors.newFixedThreadPool(NTHREADS);
Listing6.5就是一个线程对应一个任务的executor的例子。(通过Executor模拟Listing6.2场景)
Listring6.6就是顺序执行的例子。(通过Executor模拟Listing6.1场景)。
3、4,、5,6都在6.2.1,是对Executor最简单的介绍。
6.2.2节没有例子,但解释了执行策略的意思。what,where,when,how即Listing6.1模式(顺序执行),Listing6.2模式(一比一任务线程),Listing6.3模式(线程池)。
6.2.3节也没有例子
Executor将任务提交和执行策略解耦。主要也就是方便以后轻易修改执行策略。
Listing6.7通过介绍ExecutorService的方法解释了executor的生命周期
Listiing6.8通过一个支持Shutdown的web服务器例子,来说明Shutdown方法的使用.exec.shutDown().(判断exec是否shutDown, exec.isShutDown).
6.2包含Listng6.3,Listing6.4,Listing6.5,Listing6.6.Listing6.7,Listing 6.8
Listing6.9介绍了Time令人困惑的行为模式,从反向说明了timer的不可靠。
Listing6.10演示了顺序执行页面渲染的例子,说明挖掘并行性的必要性
进入6.3.2节
Listing6.11介绍了Future和Callabe接口
Listing6.12通过介绍ThreadPool对newTaskFor的默认实现来说明了ExecutorService可以将一个FutureTask和一个Callable连接起来。
Listing6.13通过使用Future来渲染页面。两个任务,一个任务渲染内容,一个任务下载图片。由于是两种不同种类的任务,这种划分取得的收益有限。
使用Future来等待图片下载完毕;
Listing6.14介绍了ExecutorCompletionService使用的QueueingFuture.QueuingFuture是FutureTask的子类。
Listing6.15使用CompletionService来渲染页面元素(当这些图片被下载完毕后)。
由于将每个图片的下载划分成不同的任务,提高了并行性。呼应本节主题“挖掘并行性”,方式:挖掘相同种类的任务。
以后进入6.3.7时限
Listing6.16通过一段时间内获取广告,演示时限版本的Future(单任务结果获取的时限)
Listing6.17通过executorservice的invokeAll方法来演示一批任务的时限。