快速业务通道

Java理论与实践: 并发在一定程度上使一切变得简单 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
Runnable() {}).start() 这个 常用的方法。但 ThreadedExecutor 有一个重要的好处:通过只改变 executor 结构,就可以转移到其它执行模型,而不必缓慢地在整个应用程序源码内查找所 有创建新线程的地方。 QueuedExecutor 使用一个后端线程来处理所有任务,这 非常类似于 AWT 和 Swing 中的事件线程。 QueuedExecutor 具有一个很好的特 性:任务按照排队的顺序来执行,因为是在一个线程内来执行所有的任务,任务 无需同步对共享数据的所有访问。

PooledExecutor 是一个复杂的线程池实现,它不但提供工作线程(worker thread)池中任务的调度,而且还可灵活地调整池的大小,同时还提供了线程生 命周期管理,这个实现可以限制工作队列中任务的数目,以防止队列中的任务耗 尽所有可用内存,另外还提供了多种可用的关闭和饱和度策略(阻塞、废弃、抛 出、废弃最老的、在调用者中运行等)。所有的 Executor 实现为您管理线程的 创建和销毁,包括当关闭 executor 时,关闭所有线程,另外还为线程创建过程 提供了 hook,以便应用程序可以管理它希望管理的线程实例化。例如,这使您 可以将所有工作线程放在特定的 ThreadGroup 中,或者赋予它们描述性名称。

FutureResult

有时您希望异步地启动一个进程,同时希望在以后需要这个进程时,可以使 用该进程的结果。 FutureResult 实用程序类使这变得很容易。 FutureResult 表示可能要花一段时间执行的任务,并且可以在另一个线程中执行此任务, FutureResult 对象可用作执行进程的句柄。通过它,您可以查明该任务是否已 经完成,可以等待任务完成,并检索其结果。可以将 FutureResult 与 Executor 组合起来;可以创建一个 FutureResult 并将其排入 executor 的队 列,同时保留对 FutureResult 的引用。清单 1 显示了一个一同使用 FutureResult 和 Executor 的简单示例,它异步地启动图像着色,并继续进行 其它处理:

清单 1. 运作中的 FutureResult 和 Executor

Executor executor = ...   ImageRenderer renderer = ...     FutureResult futureImage = new FutureResult();     Runnable command = futureImage.setter(new Callable() {       public Object call() { return renderer.render(rawImage); }     });    // start the rendering process     executor.execute(command);     // do other things while executing     drawBorders();     drawCaption();    // retrieve the future result, blocking if necessary     drawImage((Image)(futureImage.get())); // use future

Java理论与实践: 并发在一定程度上使一切变得简单(3)

时间:2010-12-21 IBM Brian Goetz

FutureResult 和高速缓存

还可以使用 FutureResult 来提高按需装入高速缓存的并发性。通过将 FutureResult 放置在高速缓存内,而不是放置计算本身的结果,可以减少持有 高速缓存上写锁的时间。虽然这种做法不能加快第一个线程把某一项放入高速缓 存,但它 将减少第一个线程阻塞其它线程访问高速缓存的时间。它还使其它线 程更早地使用结果,因为它们可以从高速缓存中检索 FutureTask 。清单 2 显 示了使用用于高速缓存的 FutureResult 示例:

清单 2. 使用 FutureResult 来改善高速缓存

public class FileCache {   private Map cache = new HashMap();   private Executor executor = new PooledExecutor();   public void get(final String name) {    FutureResult result;    synchronized(cache) {     result = cache.get(name);     if (result == null) {      result = new FutureResult();      executor.execute(result.set

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号