3

我在我的应用程序中使用线程池。我已将 TreadPoolExecutor 子类化并覆盖了方法 beforeExecute、afterExecute 和出于统计目的而终止。
我还实现了自己的 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

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

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

我不明白为什么我只需要用 Runnable 对象覆盖方法(beforeExecute、afterExecute)而没有 Callable 对象(因为我需要检索结果)。我缺少或不明白的东西?也许我需要子类 FutureTask 不确定?

谢谢你的帮助,

4

1 回答 1

0

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

编辑:另外,如果您使用可调用对象,您可能需要使用ExecutorService.

于 2011-10-06T12:38:40.233 回答