JDK 5.0 concurrent学习(一)

转载 2006年05月25日 15:19:00
JDK 5.0 concurrent学习(一)

整个的列出顺序是在我学习concurrent javadoc的顺序上,按照依赖关系排序,依赖其他JDK 5.0中类越少、越容易理解的排在越前面。

  • TimeUnit

顾名思义,就是时间的单位。以前如果调用方法需要传入时间参数,时间参数的单位都是通过javadoc说明的,比如说Thread.sleep(long),时间的参数就是毫秒,如果需要休眠一秒,则需要调用Thread.sleep(1000)。

JDK 5.0中加入了该类,为时间数字后面加上了个单位,如TimeUnit.MILLISECONDS是毫秒, TimeUnit.SECONDS是秒,等等。目前感觉上用处并不是太大,如果说原来某调用只需要一个参数,那现在就需要传两个参数,实现类也需要通过传入的两个参数进行转换,反而麻烦了一些。稍微有些为了OO而OO的嫌疑:)

示例:

    假设某方法的声明是invoke(int time, TimeUnit timeUnit),那么在理论上invoke(1, TimeUnit.SECONDS)invoke(1000,TimeUnit.MILLISECONDS)是等价的,当然,如果实现中没有做判断,结果还是会不一样。

  • Callable

单方法接口,非常类似于Runnable,之所以存在该接口而不是用Runnable接口的原因就是:Callable可以有返回值,并可以抛出checked异常。其方法声明为:V call() throws Exception

通过javadoc可以看到,在concurrent包中的不少方法有method(Callable)和method(Runnable,T)这两种形式,如ExecutorService.submit/FutureTask的构造方法等等。但我的感觉是如果存在着不少的这类方法,为什么不通过一个简单的包装类来做Runnable和Callable之间的转换,却采用众多的方法重载来实现?我个人认为如method(new CallableWrapper(Runnable,T))这种形式似乎更好一点。

  • Future

其表现了一个异步操作的结果,该类是POSA2中的Active Object的一个重要组成部分。

在异步操作中,方法调用和方法执行是分开的,比如可以在时间点1时,A调用了B的一个方法去执行某项操作并立即返回,而该操作实际上在时间点2才执行完毕,那么Future类就可以表现整个异步操作的结果,如A调用B方法时返回的就是一个Future对象,可以通过调用future.isDone()来判断该异步操作是否完成,可以调用future.cancel(boolean)来取消尚未执行或中止正在执行的异步操作,还可以通过future.get()来得到异步操作的结果,如果异步操作尚未完成,该方法会一直阻塞,知道该异步操作完成。

目前我所接触到的异步操作大多是通过IOC来实现的。一般IOC都是在方法调用时或方法调用前注册一个回调钩子,等到方法执行完毕,再通过这个回调钩子通知调用者。就用Cindy中一个简单的例子来说明:

session.addSessionListener(new SessionAdapter() {
    public void sessionEstablished(...) {
        //do something
    }
});
session.start();
//do something else

这种方式对于回调控制的比较弱,什么时候回调,会在哪个线程内被回调,应用无法控制。而Future表现的则是表现异步操作的另一种方式,控制权掌握在调用者本身,如上面的代码用Future来改写:

Future future = session.start();
if (!future.isDone())
  //do something else
future.get();   //如果该异步操作还未执行完毕,则会阻塞,直到执行完毕并返回结果
//do something

可以看到,这种方式所有的控制权都在于调用者本身,比如可以做到如果在1s内该操作还未执行完毕,则取消该操作等等。但是IOC的方式并不是没有价值的,它拥有更大的吞吐量,可以看出,如果要得到异步的结果,Future方式要么是采用轮询去判断操作是否完成,要么是采用阻塞等待的方式,不管是采用哪种方式,系统总体的吞吐量都会降低(尽管相对于同步调用,系统的总体吞吐量是上升了)。

我的观点是:

吞吐量角度:   同步调用  <  异步Future方式   < 异步IOC方式
控制角度:      同步调用  >  异步Future方式   > 异步IOC方式

采用何种方式,要依据设计什么样的系统而定,嘿嘿,废话:)

相关文章推荐

JDK源码学习(8)-java.util.concurrent.ConcurrentHashMap

主要是jdk8的线程安全hashMap的源码分析

黑马程序员_java jdk5.0新特性和枚举的学习笔记

------- android培训、java培训、期待与您交流! ----------   1.Jdk5.0新特性: Collection在jdk1.5以后,有了一个父接口Iterable,...

java学习之JDK5.0特性

1、foreach 2、函数可变参数 3、静态导入

今天学习的内容dom4j编程、debug调试、JDK5.0新特性

dao data access object 数据访问对象 关于dom4j 一、获得document //获得解析流 SAXReader reader = new SAXReader(); ...

JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介

在多线程大师Doug Lea的贡献下,在JDK1.5中加入了许多对并发特性的支持,例如:线程池。 一、简介 线程池类为 java.util.concurrent.ThreadPoolExe...

Java jdk5.0学习笔记(1-6)

  • 2007-06-16 14:50
  • 8.54MB
  • 下载

良葛格JDK5.0学习笔记

  • 2007-04-23 14:11
  • 377KB
  • 下载

jdk 1.5中的concurrent 在多线程并发中的使用

我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)