2009-09-23 40 views
3

我真的想创建一个FutureTask的子类,它具有默认的无参数构造函数。特别是,我希望我的子类实现Callable接口并使用它自己作为可调用对象。这样,MyFutureTask的用户可以继承MyFutureTask的子类,而不必实现自己的可调用方法,并将它传递给FutureTask的一个实例。FutureTask实现Callable

这里的总体思路:

public abstract class MyFutureTask<Result> extends FutureTask<Result> implements Callable<Result> { 

    public MyFutureTask() { 
     super(/*XXX*/);   
    } 

    public abstract Result call() throws Exception; 

} 

的问题是,我能放在XXX? FutureTask需要Callable,但我无法通过this,因为java不允许在super的调用中引用this。我不能实例化一个嵌套类,因为这也是不允许的。

有没有一种聪明(或非聪明)的方式可以做到这一点?

+0

我还不清楚你为什么要这样做?您通常不会自己创建FutureTasks,而是通过ScheduledExecutorService将您的Callable变成FutureTask。 – skaffman 2009-09-24 07:38:39

+0

如果你想实现可取消的计算,你将不得不自己做。 – MrWhite 2009-09-24 10:04:35

+0

你问你怎么才能实现这个设计,但是我担心,即使你成功了,你的客户也会迷惑不解。他们调用MyFutureTask#call()的结果是否与RunnableFuture#run()和Future#get()之间的关系有关?你的call()函数是否等于run()跟get()? – seh 2009-11-22 00:46:28

回答

2

你可以用组合和创建一个抽象类来做到这一点。现在你的客户端从可调用接口中分离出来了。

import java.util.concurrent.Callable; 
import java.util.concurrent.FutureTask; 

public abstract class MyFutureClass<V> implements Callable<V> { 

private final FutureTask<V> futureTask; 

public MyFutureClass() { 
    futureTask = new FutureTask<V>(this); 
} 

@Override 
public V call() throws Exception { 
    return myCall(); 
} 

protected abstract V myCall(); 

public FutureTask<V> getFutureTask() { 
    return futureTask; 
} 
} 
+0

很好,谢谢你们。是的,这将起作用,虽然它具有不从FutureTask延伸的缺点,所以我无法将它传递到任何期望FutureTask的地方。不幸的是,到目前为止,尽管这是我见过的最好的解决方案。 – emmby 2009-09-25 19:41:29