我在我的应用程序中使用线程池。我已经子类化了TreadPoolExecutor,并覆盖了beforeExecute, afterExecute和terminated方法,以便统计。
我还实现了自己的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
我的问题是,当我调用前后执行钩子时,如何检索保存在可调用任务中的信息?或者我想我要做的是给线程池的每个线程一个特定的名字,这是可能的吗?
我可以清楚地看到在调试模式下隐藏在Runnable对象/FutureTask/callable中的Eclipse变量视图中的信息。
我不明白为什么我只需要重写方法(beforeExecute, afterExecute)与Runnable对象,没有Callable的(因为我需要检索结果)。我错过了什么或者不明白什么?也许我需要子类FutureTask不确定?
谢谢你的帮助,
如果您希望在每次调用之前和之后发生事情而不是覆盖beforeExecute
和afterExecute
,则更容易超类DoTask
。
编辑:此外,如果您使用可调用对象,您可能需要使用ExecutorService
.