2012-09-13 63 views
3

我希望能夠獲得我已將submit綁定到目前正在進行的ExecutorService(特別是ThreadPoolExecutor)的Callables(因此它們不可通過getQueue() )。確定哪些Callables當前正在ExecutorService中運行

我試着創建一個子類來覆蓋beforeExecute,但是Runnable原來是一個FutureTask,而不是原來的提交的Callable。

是否有另外一種方法可以確定活動的可活動?


歸根結底有兩件事情我願意做這樣的信息:

  1. 獲取正在運行的任務,使他們能夠在用戶界面中,如果該文件被引用顯示
  2. 檢查可贖回相匹配的模式,如果是這樣,取消
+0

可能會有幫助:http://stackoverflow.com/questions/6933219 /如何到獲取到futuretask-執行狀態。您想要如何精確跟蹤任務的狀態? – zeller

回答

5

您可以覆蓋AbstractExecutorService.newTaskFor(),它應該給你訪問到原來的Runnable秒和Callable s。然後用你的跟蹤裝飾者裝飾它們並傳遞給super.newTaskFor()

1

suggested by axtavt我創建的FutureTask一個子類:

public class FutureCallable<V> extends FutureTask<V> { 
    private Callable<V> callable; 

    public FutureCallable(Callable<V> callable) { 
     super(callable); 
     this.callable = callable; 
    } 

    public Callable<V> getCallable() { 
     return callable; 
    } 

} 

,並推翻我ThreadPoolExecutor子類的幾種方法:

public class CustomThreadPoolExecutor extends ThreadPoolExecutor { 
    private Set<FutureCallable<UpdateResult>> running = new HashSet<FutureCallable<UpdateResult>>(); 

    @Override 
    public <T> FutureCallable<T> newTaskFor(Callable<T> callable) { 
     return new FutureCallable<T>(callable); 
    } 

    @Override 
    protected void beforeExecute(Thread t, Runnable r) { 
     FutureCallable<UpdateResult> task = (FutureCallable<UpdateResult>) r; 
     running.add(task); 
    } 

    @Override 
    protected void afterExecute(Runnable r, Throwable t) { 
     FutureCallable<UpdateResult> task = (FutureCallable<UpdateResult>) r; 
     running.remove(task); 
    } 

    ... 
} 
相關問題