我需要在ThreadExExecutor beforeExecute和afterExecute钩子之间做出澄清

时间:2011-10-06 12:28:11

标签: java multithreading executors

我在我的应用程序中使用线程池。我已经将TreadPoolExecutor子类化,并在执行之前覆盖方法,在执行之后覆盖并终止以用于统计目的。
我也实现了自己的ThreadFactory并覆盖了newThread方法。

我理解线程包装器类创建了十几个“可调用”任务,并调用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

我的问题是,当我调用执行挂钩之前和之后,如何检索可调用任务中保存的信息?或者我想我想要做的是给线程池的每个线程一个特定的名称是可能的吗?

我可以清楚地看到Eclipse变量视图中的信息存在于Runnable对象/ FutureTask / callable中隐藏的调试模式中。

我不明白为什么我只需要用Runnable对象覆盖方法(beforeExecute,afterExecute)而没有可调用的方法(因为我需要检索结果)。我遗失或不理解的东西?也许我需要子类FutureTask不确定?

感谢您的帮助,

1 个答案:

答案 0 :(得分:0)

如果您希望在每次调用之前和之后发生事情而不是覆盖DoTaskbeforeExecute,那么超级afterExecute会更容易。

编辑:此外,如果您使用的是callables,则可能需要使用ExecutorService