我在我的应用程序中使用线程池。我已将 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 不确定?
谢谢你的帮助,