2009-09-23 98 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