用J2SE1.5建立多任务的Java应用程序
2008-01-05 20:06:19 来源:WEB开发网J2SE 5.0中的java.util.concurrent程序包提供了一个新的线程框架组件,这个框架组件处理了与建立、执行和治理线程相关的很多低层细节信息。在本文中我们将细致地了解一下它的重要特性。
假如你使用C、C++或Java先前的版本进行多线程编程,就知道在代码中治理线程是多么头疼的事情。在单线程程序中,代码中引起应用程序失败的bug每次都在同一个点出现。但是在多线程程序中,只有某些原因碰到一起的时候才会出现失败。由于预见可能引发应用程序失败的所有条件是非常困难的,所以多线程编程是有挑战性的。有些程序员从根本上避免这种挑战,而另外一些--聪明的解决问题的人员--则一直坐在他们的计算机面前直到问题解决。
J2SE 5.0平台包含了一个新的并发工具程序包。这个程序包中的类替并发类(concurrent classe)或并发设计中使用的应用程序建立阻塞(blocking)。该并发工具包含下面一些内容:
· 高性能的、灵活的线程池
· 异步执行事务的框架组件
· 为并发访问优化过的集合类宿主(host)
本文介绍了J2SE 5.0框架组件类和它们的重要特性。本文的下载代码提供了一些简单的、轻易使用的示例,它演示了所有的新线程框架组件类。你在阅读文章内容之后运行这些示例可以使自己对这些特性有更好的理解。
Executor(执行器)框架组件
Executor框架组件提供了一个简单的、标准的、可扩充的类,它提供了一些有用的功能,假如没有这些功能,我们要手工实现这些它们,会觉得十分单调和困难。该框架组件使调用、调度和执行的操作标准化了。它通过一组执行策略为控制异步事务提供了支持。
Executor接口执行已提交的可以运行的事务。它提供了一条途径,答应我们把事务提交从事务执行机制中分离出来。程序员通常使用Executor代替显式地(eXPlicitly)建立线程。Executor接口也提供事务的同步和异步执行。
对于同步执行,使用下面的命令:
Class MySynExecutor implements Executor{
public void execute(Runnable r) {
r.run();
}
}
对于异步执行,使用下面的命令:
Class MyASynExecutor implements Executor{
public void execute(Runnable r) {
new Thread(r).start();
}
}
ExecutorService(执行器服务)类
ExecutorService类为治理一个或多个异步事务的终止和跟踪事务执行的过程提供了方法。代码下载中的MyExecutorService.java文件演示了治理事务终止的过程。它初始化了大小为三个的线程池,然后依次添加了线程。当线程的数量达到线程池的大小限制时,它调用关闭(shutdown)方法。在调用shutdown()方法之后,这个线程池不再接受新事务的执行。在等待十秒以后,该线程池调用shutDownNow()。这个方法会尽最大的努力来终止所有运行中的事务。在示例中,应用程序试图终止运行中的线程失败了。
ScheduledExecutorService(调度执行器服务)
ScheduledExecutorService类是我的最喜欢的类。它对于调度那些周期性执行的事务非常方便,而周期性执行的事务对于清除工作(例如清除你的应用程序建立的临时文件等等)尤其有用。下载代码中的MyScheduledExecutorService.java文件通过每五秒钟发出"嘟嘟"一声演示了调度的过程:
final Runnable beeper = new Runnable() {
public void run() { System.out.PRintln("beep"); }
};
final ScheduledFuture beeperHandle =scheduler.scheduleAtFixedRate(beeper, 1, 5, SECONDS);
Future和FutureTask