关于java.util.concurrent您不知道的5件事,第2部分 - 编程入门网
ystem.out.println("It''s a race of " + r.getDistance() + " lengths");
System.out.println("Press Enter to run the race....");
System.in.read();
r.run();
}
}
注意,在 清单 2 中,CountDownLatch 有两个用途:首先,它同时释放所有线程,模拟马 赛的起点,但随后会设置一个门闩模拟马赛的终点。这样,“主” 线程就可以输出结果。为了 让马赛有更多的输出注释,可以在赛场的 “转弯处” 和 “半程” 点,比如赛马跨过跑道的 四分之一、二分之一和四分之三线时,添加 CountDownLatch。 关于java.util.concurrent您不知道的5件事,第2部分(3)时间:2012-04-24 IBM Ted Neward3. Executor 清单 1 和 清单 2 中的示例都存在一个重要的缺陷,它们要求您直接创建 Thread 对象。 这可以解决一些问题,因为在一些 JVM 中,创建 Thread 是一项重量型的操作,重用现有 Thread 比创建新线程要容易得多。而在另一些 JVM 中,情况正好相反:Thread 是轻量型的, 可以在需要时很容易地新建一个线程。当然,如果 Murphy 拥有自己的解决办法(他通常都会 拥有),那么您无论使用哪种方法对于您最终将部署的平台都是不对的。 JSR-166 专家组在一定程度上预测到了这一情形。Java 开发人员无需直接创建 Thread,他 们引入了 Executor 接口,这是对创建新线程的一种抽象。如清单 3 所示,Executor 使您不 必亲自对 Thread 对象执行 new 就能够创建新线程: 清单 3. Executor
使用 Executor 的主要缺陷与我们在所有工厂中遇到的一样:工厂必须来自某个位置。不幸 的是,与 CLR 不同,JVM 没有附带一个标准的 VM 级线程池。 Executor 类实际上 充当着一个提供 Executor 实现实例的共同位置,但它只有 new 方法 (例如用于创建新线程池);它没有预先创建实例。所以您可以自行决定是否希望在代码中创 建和使用 Executor 实例。(或者在某些情况下,您将能够使用所选的容器/平台提供的实例。 ) ExecutorService 随时可以使用 尽管不必担心 Thread 来自何处,但 Executor 接口缺乏 Java 开发人员可能期望的某种功 能,比如结束一个用于生成结果的线程并以非阻塞方式等待结果可用。(这是桌面应用程序的 一个常见需求,用户将执行需要访问数据库的 UI 操作,然后如果该操作花费了很长时间,可 能希望在它完成之前取消它。) 对于此问题,JSR-166 专家创建了一个更加有用的抽象(ExecutorService 接口),它将线 程启动工厂建模为一个可集中控制的服务。例如,无需每执行一项任务就调用一次 execute() ,ExecutorService 可以接受一组任务并返回一个表示每项任务的未来结果的未来列表。 4. ScheduledExecutorServices 尽管 ExecutorService 接口非常有用,但某些任务仍需要以计划方式执行,比如以确定的 时间间隔或在特定时间执行给定的任务。这就是 ScheduledExecutorService 的应用范围,它 扩展了 ExecutorService。 如果您的目标是创建一个每隔 5 秒跳一次的 “心跳” 命令,使用 ScheduledExecutorService 可以轻松实现,如清单 4 所示: 清单 4. ScheduledExecutorService 模拟心跳
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |