`
lixinye0123
  • 浏览: 340801 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

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

    博客分类:
  • 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(交换器)类。本文没有介绍这些类的详细的分析和使用信息,因为理解它们需要一些理论背景。

拥有了这些新的类之后,你可以说服害怕多线程技术的技术上司开发多线程应用程序了。


分享到:
评论

相关推荐

    j2se1.5中文api

    J2SE 1.5中文API为中国的开发者提供了方便,它详细地阐述了这个版本中的各种类库、接口、方法和异常,是理解和使用Java 5.0核心功能的重要参考资料。 一、泛型(Generics) J2SE 1.5引入了泛型,这是一种类型安全...

    J2SE 1.5帮助文档

    J2SE帮助文档英文版。包含java库函数的说明用法等。

    Collections & Generics in J2SE 1.5

    ### Collections与Generics在J2SE 1.5中的应用 #### 快速回顾Collections 在深入了解Generics之前,我们先快速回顾一下Java中的Collections框架。Collections是Java平台的一个核心特性,它为开发者提供了一组丰富...

    J2SE 1.3,1.4,1.5,1.6,1.7,1.8 API.zip

    Java SE(标准版)是Java开发工具包的一个关键部分,提供了用于构建和运行Java应用程序所需的类库和API。本资源包含从J2SE 1.3到1.8的完整API文档,对于开发者来说,这是一个宝贵的参考资料,可以深入了解不同版本间...

    J2SE 1.5版本的新特性一览

     到了2003的年末,J2SE1.5的beta版本就将发布了。这次发布和现在已经发布的J2SE1.4的两个更新1.4.1和1.4.2都如2003年的JavaOne大会预期的发布。如果你没有参加这次大会,或者想重新回顾一下,那么下面就是这次大会...

    J2SE基础,内容是JAVA

    Java J2SE(Java 2 Platform, Standard Edition)是Java平台的核心部分,它提供了用于开发和部署桌面应用程序的API和运行环境。这个平台包含了Java语言的基础类库,如集合、多线程、网络编程、I/O操作等核心功能。在...

    实验1 JAVA开发环境J2SE实验报告.doc

    JAVA开发环境J2SE实验报告 在本实验中,我们将学习和掌握JAVA开发环境J2SE...在未来,我们可以继续学习和深入研究JAVA开发环境J2SE的更多功能和应用,例如使用Java开发Web应用程序、移动应用程序、桌面应用程序等等。

    j2se API 1.5 文档

    j2se API 1.5 文档

    J2SE实例(Java桌面程序)

    Java 2 Standard Edition (J2SE) 是Java平台的核心组件,用于开发和部署桌面应用程序。这个实例集合提供了丰富的Java源代码示例,可以帮助学习者深入理解J2SE的各种特性和功能。通过这些实例,你可以了解到如何在...

    jdk1.8,亲测可用

    J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。 2004年9月30日,J2SE1.5发布。为了表示该版本的...

    ee.j2se-1.5.0.jar

    jar包,官方版本,自测可用

    Java j2se QQ 毕业论文

    Java J2SE(Java Standard Edition)是Java平台的标准版,它是Java开发工具集的一个子集,主要用于桌面应用程序的开发。本毕业论文将深入探讨如何利用Java J2SE技术来实现一个QQ类似的即时通讯软件,这涉及到Java...

    j2se-doc-cn java的API文档,有助于你写JAVA程序

    Java API文档是学习和开发Java程序的重要资源,它包含了Java平台标准版(J2SE)的所有公共类、接口和方法的详细说明。这份名为“j2se-doc-cn”的压缩包包含的是Java API的中文版,对于中国开发者来说,无疑极大地...

    Java Application-J2SE实例基础程序

    Java Application-J2SE实例基础程序是Java编程领域中的核心部分,主要关注于桌面应用程序的开发。J2SE,即Java 2 Platform, Standard Edition,是Java平台的标准版,提供了开发和运行桌面应用、服务器端应用以及网络...

    J2SE桌面应用开发

    多线程是 J2SE 的另一大特色,它允许程序同时执行多个任务,提高了系统效率。通过实现 Runnable 接口或继承 Thread 类,开发者可以创建并管理自己的线程,实现并发操作。 IO 流(Input/Output Stream)是 Java 处理...

    java j2se源码

    Java J2SE(Java Standard Edition)是Java平台的核心部分,主要用于桌面应用开发。它提供了丰富的类库和API,使得开发者可以构建跨平台的应用程序。马士兵老师的J2SE课程是许多初学者和进阶者学习Java的重要资源。...

    J2SE6.0API+JAVA-API1.6中文版合集

    "J2SE6.0 API + JAVA-API1.6中文版合集"是一个非常实用的资源,它整合了Java Standard Edition(J2SE)6.0版本和Java API 1.6的中文文档,为开发者提供了详细的API参考,帮助他们更好地理解和使用这两个版本中的各种...

    J2SE API应用程序接口使用文档

    Java 2 Standard Edition (J2SE) API 应用程序接口使用文档是Java开发者的重要参考资料,它包含了Java语言的核心库,这些库提供了大量的类和接口,用于构建各种类型的桌面应用程序、服务器端应用以及网络服务。...

    java课程设计大作业-用J2SE写的一个坦克大战小游戏

    java课程设计大作业——用J2SE写的一个坦克大战小游戏java课程设计大作业——用J2SE写的一个坦克大战小游戏java课程设计大作业——用J2SE写的一个坦克大战小游戏java课程设计大作业——用J2SE写的一个坦克大战小游戏...

    (J2SE平台Java程序设计)阶段测试题

    以上几个题目覆盖了Java语言的基础知识,包括程序结构、编译流程、构造函数的使用、方法重载、基本数据类型的运算以及垃圾回收机制。这些知识点对于初学者来说非常重要,能够帮助他们更好地理解和掌握Java编程语言的...

Global site tag (gtag.js) - Google Analytics