- 浏览: 340817 次
- 性别:
- 来自: 温州
-
文章分类
最新评论
-
helloworldlove:
Axis_UNZIP_PATH\Axis-version\we ...
3步把您的java程序转换为webservice -
hcqenjoy:
这个工具能再提供下吗 已经没办法下载了 谢谢
汉化 Flex Builder 3 帮助文档 -
NASa_CJ:
String source = HttpClientExamp ...
利用HttpClient获取网页内容 -
zlsj80:
下载地址无效了,楼主修正一下吧
汉化 Flex Builder 3 帮助文档 -
fykyx521:
下载地址都不能用了,是不过时了
汉化 Flex Builder 3 帮助文档
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{ |
对于异步执行,使用下面的命令:
Class MyASynExecutor implements Executor{ |
ExecutorService(执行器服务)类
ExecutorService 类为管理一个或多个异步事务的终止和跟踪事务执行的过程提供了方法。代码下载中的MyExecutorService.java文件演示了管理事务终止的 过程。它初始化了大小为三个的线程池,然后依次添加了线程。当线程的数量达到线程池的大小限制时,它调用关闭(shutdown)方法。在调用 shutdown()方法之后,这个线程池不再接受新事务的执行。在等待十秒以后,该线程池调用shutDownNow()。这个方法会尽最大的努力来终 止所有运行中的事务。在示例中,应用程序试图终止运行中的线程失败了。
ScheduledExecutorService(调度执行器服务)
ScheduledExecutorService 类是我的最喜欢的类。它对于调度那些周期性执行的事务非常方便,而周期性执行的事务对于清除工作(例如清除你的应用程序建立的临时文件等等)尤其有用。下 载代码中的MyScheduledExecutorService.java文件通过每五秒钟发出"嘟嘟"一声演示了调度的过程:
final Runnable beeper = new Runnable() { =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()){ |
在事务完成以后,就使用get方法从Future对象中检索结果:
System.out.println("Here is result..."+future.get()); |
有了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(交换器)类。本文没有介绍这些类的详细的分析和使用信息,因为理解它们需要一些理论背景。
拥有了这些新的类之后,你可以说服害怕多线程技术的技术上司开发多线程应用程序了。
发表评论
-
Java 5.0 多线程编程实践
2006-01-23 13:20 787<noscript type="text/ja ... -
web开发框架——JSF开发实战
2006-01-23 20:01 1446JSF开发实战的第一篇(jsf开发实战一)演示了如何建立一个最 ... -
Tomcat 的数据库连接池设置与应用
2006-01-23 20:28 7821.将数据库驱动程序的JAR文件放在Tomcat的 commo ... -
Eclipse Plugins Manager Beta 0.1 (Link's Only) 发布
2006-03-18 17:11 815<noscript type="text/ja ... -
常青图书管理系统 BETA V0.1
2006-03-19 15:03 856<noscript type="text/ja ... -
Java程序的性能优化
2006-03-19 15:15 819<noscript type="text/ja ... -
Java中四种XML解析技术之不完全测试
2006-03-20 12:16 713<noscript type="text/ja ... -
解决Tomcat中文乱码问题
2006-03-26 22:58 883一、中文问题的来源 计算机最初的操作系统支持的编码是单 ... -
Swing技巧. 设置全局字体(sun jdk)
2006-04-02 14:04 1362S ... -
Dom4j 使用简介
2006-04-05 20:19 687DOM4J是dom4j.org出品的一个开源XML解析包 ... -
Java手机技术 之 J2ME及其基本慨念
2006-04-06 12:42 739如果您曾经http://www.javasoft.com ;网 ... -
Java手机技术 之 J2ME新手入门要点
2006-04-06 12:50 1015一、J2ME中需要的Java基础知识现在有大部分人,都是从零开 ... -
JAVA设计模式系列之Singleton模式
2006-04-06 13:18 848单态定义: Singleton模式主要作用是保证在Java应 ... -
高手指点你实战体会Java的多线程编程
2006-04-06 13:39 850在 Java 程序中使用多线程要比在 C 或 C++ 中容 ... -
Java基础--JSP应用语法详解大全
2006-04-06 13:49 9241)HTML注释: 可以用注释内容,也可以用表达式. 2) ... -
javamail使用完全手册
2006-04-08 20:44 8951,哪里是开始:初始环境,安装好你的j2sdk和你的web服务 ... -
JavaMail通过sina的smtp验证
2006-04-08 20:47 1142import javax.mail.*;import java ... -
用javamail发送邮件
2006-04-08 20:49 1008用javamail发送邮件 aistill(原作) ... -
修改后可以发送附件、抄送、密送的javabean
2006-04-08 20:51 958/**A ... -
javamail实现smtp身份认证
2006-04-08 20:57 972现在大多 ...
相关推荐
2004年,J2SE1.5的发布被视作Java发展史上的一个重要里程碑,其后Sun公司继续推动Java的发展,直到2006年JRE6.0的发布,Java已经成为全球开发者不可或缺的工具。 #### 二、Java编程语言的定义与特性 Java不仅仅是...
J2EE(Java 2 Platform, Enterprise Edition)为开发企业级应用程序提供了标准框架,包括服务器端组件、数据库连接、安全性和可扩展性等功能,非常适合构建大规模的即时通讯系统。 【系统设计与建模】 在JICQ的...
- 第2章探讨Java多线程编程,介绍利用Java的多线程功能编程,并处理多个任务的应用程序,以及多线程的著名问题的实现程序。 - 第3章讲解Java输入/输出编程,包括文件的读写、压缩以及流、管道等的操作,目录示例器、...
- Java Management Extensions (JMX) 用于监控和管理应用程序。 - **设备层(Instrumentation Level)** - 管理对象模型,包括 MBeans。 - **代理层** - JMX 代理负责与 MBeans 交互。 - **分布服务层** - ...
这个版本是 JavaEE 平台的起点,它随着 Java 2 Standard Edition (J2SE) 一起发布,包含了 10 个规范和 API,主要关注企业应用程序所需的常用 Web 层、业务逻辑、表示层和消息传递服务。 - **J2EE 1.3**(2001 年 9...