频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

用J2SE1.5建立多任务的Java应用程序

作者: 出处:Yesky  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2006-01-11 11:47
关 键 词:Java  J2SE  多任务
阅读提示:J2SE 5.0中的Java.util.concurrent程序包提供了一个新的线程框架组件,这个框架组件处理了与建立、执行和管理线程相关的很多低层细节信息。本文将介绍如何用J2SE1.5建立多任务的Java应用程序
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
在Java的早期版本中,查询运行中的线程状态,以及使线程在执行之后返回一个值是非常困难的。由于run(运行)方法返回void,你必须编写大量的代码从线程中返回一个值。使用过这种方法的程序员肯定了解其痛苦的经历。
你可以使用Future接口或者FutureTask类从异步执行的线程中得到一个返回值。Future接口提供了检查计算过程是否完成、检索计算结果或终止计算过程的一些方法。FutureTask类提供了Future接口方法的基本实现(implementation)。只有计算过程完成以后才能检索结果;如果计算过程没有完成,get方法会被阻塞(block)。
下载代码中的MyStringReverser.java文件演示了FutureTask类的使用,并提供了一个容易理解的示例。它以每秒钟一个字符的速度从后向前显示提交的字符串,同时主线程检测事务是否完成了:
while(!future.isDone()){
 System.out.println("Task not yet completed.");
 try{
Thread.currentThread().sleep(500);
 }catch(InterruptedException ie){
System.out.println("Will check after 1/2 sec.");
 }
}

在事务完成以后,就使用get方法从Future对象中检索结果:
System.out.println("Here is result..."+future.get());
ThreadPoolExecutor(线程池执行器)

有了ThreadPoolExecutor类之后你可以编写自己的服务器了。这个类为配置和调整服务器提供了很多的特性,与很多大规模的企业级EJB服务器相似。下面是它的一些配置参数:
• 核心和最大的线程池大小
通过把corePoolSize和maximumPoolSize设置为相同的值,你就可以建立一个大小固定的线程池了。通过把maximumPoolSize设置为一个极大的值(例如Integer.MAX_VALUE),你就可以允许线程池容纳任意数量的并发事务了。
• 根据需要构造
在默认情况下,只有在新事务要求的时候,ThreadPoolExecutor才开始建立和启动核心的线程,但是你可以使用prestartCoreThread或prestartAllCoreThreads动态地重载它。
• 保持活动的时间
如果线程池中当前线程的数量超过了corePoolSize,那么这些超过的线程的空闲时间大于keepAliveTime的时候,它们就会被终止。
• 排队
排队遵循下面的规则:
• 如果正在运行的线程数量少于corePoolSize,Executor总会添加新线程而不会排队。
• 如果corePoolSize或更多数量的线程在运行,Executor总会对请求进行排队而不会添加新线程。
• 如果某个请求不能参与排队,就会建立新线程,除非线程数量超过了maximumPoolSize(在超过的情况下,该事务会被拒绝)。
• Hook方法
这个类提供了beforeExecute()和afterExecute() hook方法,它们分别在每个事务执行之前和之后被调用。为了使用它们,你必须建立这个类的子类(因为这些方法是受保护的)。
下载代码中的MyThreadPoolExecutor.java提供了一些监视多种配置参数的详细示例。你可以发现随着每个事务的增加和完成,线程池和队列大小在不断变化。你可以修改代码中的设置信息。 并发集合
JDK 1.5提供了下面一些集合实现,它们是被设计为用于多线程环境的:
• ConcurrentHashMap
• CopyOnWriteArrayList
• CopyOnWriteArraySet
ConcurrentHashMap类为检索和更新(update)可调整的预期的并发性提供了完整的线程安全的(thread-safe)并发性支持。CopyOnWriteArraySet是一组线程安全的变量集合,CopyOnArrayList是一个线程安全的数组列表(ArrayList)变量。在修改原始的数组或集合之前,它们中的每一个都会把下层的数组或集合复制一份。其结果是,读取的速度很快,而更新的速度很慢。
并发集合类为Iterator(迭代子)提供快照式的数据(即使下层数据发生了改变,在Iterator中也不会反映出来)。
同步器(Synchronizer)
JDK 1.5还提供了一些高级类,例如Semaphore、CountDownLatch和CyclicBarrier,还有一个用于同步的Exchanger(交换器)类。本文没有介绍这些类的详细的分析和使用信息,因为理解它们需要一些理论背景。
拥有了这些新的类之后,你可以说服害怕多线程技术的技术上司开发多线程应用程序了。(责任编辑:铭铭)
发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看51847次)
·UML类图详解 (查看46438次)
·Java编程开发手册 (查看24908次)
·UML统一建模语言 (查看23911次)
·C#技术开发指南 (查看21990次)
·Java编程开发手册 (1195个砖)
·Java基础教程 (429个砖)
·C#技术开发指南 (304个砖)
·PB开发教程 (220个砖)
·.NET开发手册 (217个砖)
·Java编程开发手册 (653个好)
·Java基础教程 (569个好)
·.NET开发手册 (249个好)
·PB开发教程 (208个好)
·Delphi开发技术手册 (174个好)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有