2012-07-11 66 views
1

下面的代码是从AbstractExecutorService为什么类调用RunnableFuture <T>而不是CallableFuture <T>?

/** 
* Returns a <tt>RunnableFuture</tt> for the given callable task. 
* 
* @param callable the callable task being wrapped 
* @return a <tt>RunnableFuture</tt> which when run will call the 
* underlying callable and which, as a <tt>Future</tt>, will yield 
* the callable's result as its result and provide for 
* cancellation of the underlying task. 
* @since 1.6 
*/ 
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) { 
    return new FutureTask<T>(callable); 
} 

我看不出为什么类从newTaskFor()返回对象将被称为RunnableFuture代替CallableFuture?我在这里错过了什么?

回答

2

RunnableFuture表示一个特定的概念:将来的结果,其计算可以由工作者线程通过调用run()明确执行。

由于工作线程通常是不感兴趣的,他们执行计算的结果,他们使用run()不返回的结果。只要工作线程完成计算,对这些结果感兴趣的线程就可以从get()中获得它们。

2

因为它是Runnable,即具有public void run()方法,而不是Callable,其将具有<T> public <T> run()方法。

+0

调用的'()的签名'方法是这样的'V()调用抛出异常;'。通过我的意思是说他们为什么不把一个'V()调用抛出异常的问题;'方法和名称它CallableFurture,因为他们在这里做的是他们正在''可调用''FutureTask' – Inquisitive 2012-07-11 08:10:30

+0

@Subhra包装'然后我建议你相应地编辑你的问题。 – EJP 2012-07-11 08:38:06

3

一个RunnableFuture的一点是:

  1. 这是一个Future
  2. 这是一个Runnable

它转换Callable你已经到的东西,既是FutureRunnable。它涵盖了它打算涵盖的确切用例。如果你有一个Callable,需要一个Future,还有的FutureTask构造。

0

也许是简单的,因为API建筑师从来没有问过这个问题?

因为我们不知道我们只能说:有一个newTaskFor(Runnable ...)方法,它返回一个RunnableFuture,它被称为这样,因为它扩展了Runnable和Future。

然后添加了一个newTaskFor(Callable ...)方法 - 由于Callable也可以被包装成一个实现了RunnableFuture的FutureTask,他们只是做了它而不是发明一个新的接口,使用最简单可能的解决方案(即已存在的解决方案)来包装Callable:沿着Occam的剃刀原理。

相关问题