在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(交换器)类。本文没有介绍这些类的详细的分析和使用信息,因为理解它们需要一些理论背景。
拥有了这些新的类之后,你可以说服害怕多线程技术的技术上司开发多线程应用程序了。
闽公网安备 35060202000074号