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

2016-02-19 12:31 4 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享用J2SE1.5建立多任务的Java应用程序2教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - 编程语言 】

        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的时候,它们就会被终止。

排队

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

排队遵循下面的规则:

假如正在运行的线程数量少于corePoolSize,Executor总会添加新线程而不会排队。

假如corePoolSize或更多数量的线程在运行,Executor总会对请求进行排队而不会添加新线程。

假如某个请求不能参与排队,就会建立新线程,除非线程数量超过了maximumPoolSize(在超过的情况下,该事务会被拒绝)。

Hook方法

这个类提供了beforeExecute()和afterExecute() hook方法,它们分别在每个事务执行之前和之后被调用。为了使用它们,你必须建立这个类的子类(因为这些方法是受保护的)。

下载代码中的MyThreadPoolExecutor.java提供了一些监视多种配置参数的具体示例。你可以发现随着每个事务的增加和完成,线程池和队列大小在不断变化。你可以修改代码中的设置信息。 并发集合

JDK 1.5提供了下面一些集合实现,它们是被设计为用于多线程环境的:

ConcurrentHashMap

CopyOnWriteArrayList

CopyOnWriteArraySet

ConcurrentHashMap类为检索和更新(update)可调整的预期的并发性提供了完整的线程安全的(thread-safe)并发性支持。CopyOnWriteArraySet是一组线程安全的变量集合,CopyOnArrayList是一个线程安全的数组列表(ArrayList)变量。在修改原始的数组或集合之前,它们中的每一个都会把下层的数组或集合复制一份。其结果是,读取的速度很快,而更新的速度很慢。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1601096.html

延伸阅读
out momory 一阵天旋地转内存又溢出了。在手机上这种痛苦经常都有,套一句俗话在手机上用内存必须勒紧裤腰带。虽然现在pc内存上G都不希奇,可是在手机上却只能以K来记,可能某位同志会马上跳出来说也有上M的,记住中国还不富大多数手机都是低端手机。 !-- frame contents -- !-- /frame contents -- 写手机程序让我仿佛回到了dos时代...
一.代码优化 内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的切换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器来收尸。乍看之下似乎并无不...
Windows 95 和 Windows NT 4.0包含一个令人兴奋的特性:任务栏。这个通常位于区域任务条右面的区域能包含小的图标,这些图标能引出大的应用程序或者菜单。本篇文章主要讨论如何使用Delphi建立这样的应用程序。 在开始之前,请看下面的需要的接口方面的内容: 从技术方面来说,一个任务栏应用程序非常象普通的应用程序,它有一个...
最近在开发的过程中用到了字符串的替换,本来觉得挺简单的问题,却总也解决不了。字符串明明是替换了,却总也输出不了正确结果,很是郁闷,到底是为什么呢? 先来看我的代码: Newsdetialsnt=(Newsdetials)ntIter.next(); System.out.println("新闻明细记录"+nt); Stringcontent=nt.getContent(); System.out.println("新闻的内容是:"+con...
1. 安装 可以从以下网址下载一个J2EE(j2sdkee-1_3-beta2-win.exe):http://Java.sun.com/j2ee/j2sdkee-beta/index.Html。也许你已装了旧版的J2EE SDK 产品,假如是,在安装新下载的J2EE之前请先卸载或删掉旧版的J2EE SDK。运行j2sdkee-1_3-beta2-win.exe,按安装步骤安装好J2EE。这里假设你的J2EE安装在:C:j2sdkee1.3 目录下。 ...

经验教程

595

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部