2011-10-06 17 views
3

我在我的應用程序中使用線程池。我已經劃分了TreadPoolExecutor,並覆蓋beforeExecute,afterExecute和終止用於統計目的的方法。
我也已經實現了我自己的ThreadFactory並覆蓋了newThread方法。我需要澄清ThreadExpExcutor beforeExecute和afterExecute掛鉤

我明白,threadpool包裝類創建了一打「可調用」的任務,並調用invokeAll方法來獲取結果。在每個任務中都有一個接口對象。基本的X對象實現了接口並且已經被多次分類。所以,當執行線程池它將啓動對象X.

的孩子的從代碼的角度,它看起來有點像:

the wrapper threapool class: 

List<DoTask> tasks;  

tasks.add(new DoTask(new A("A")); 
tasks.add(new DoTask(new B("B")); 
tasks.add(new DoTask(new C("C")); 

results = threadpool.invokeAll(tasks, 60, TimeUnit.Seconds); 

in my DoTask class: public DoTask implements Callable 

constructor: DoTask(ifaceX x) 

im my Base class X: public class X implements ifaceX 
In my child class A, B, C: public A extends X 

我的問題是,當我調用執行鉤子之前和之後時,如何檢索保存在可調用任務中的信息?或者我想我想要做的是給每個線程池的具體名稱是可能的?

我可以清楚地看到隱藏在Runnable對象/ FutureTask/callable中的隱藏在調試模式下的Eclipse變量視圖中的信息。

我不明白爲什麼我只需要用Runnable對象覆蓋方法(beforeExecute,afterExecute)並且沒有可調用對象(因爲我需要檢索結果)。我失蹤或不明白的東西?也許我需要繼承FutureTask不確定嗎?

感謝您的幫助,

回答

0

,如果你想要的東西之前,每個呼叫,而不是覆蓋beforeExecuteafterExecute發生後,它會更容易進行超DoTask

編輯另外,如果您使用的是可馴化品,您可能需要使用ExecutorService

+0

我相信他問的是before/afterExecute()如何處理Callable任務而不是Runnable? – Will