アプリケーションでスレッドプールを使用しています。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
私の質問は、前と後の実行フックを呼び出すときに、呼び出し可能なタスクに保持されている情報を取得する方法です。または、スレッドプールの各スレッドに特定の名前を付けることは可能ですか?
Runnable オブジェクト/FutureTask/callable に隠されているデバッグ モードの Eclipse 変数ビューに情報があることがはっきりとわかります。
メソッド (beforeExecute、afterExecute) を Runnable オブジェクトでオーバーライドし、Callable オブジェクトをオーバーライドする必要がない理由がわかりません (結果を取得する必要があるため)。私が見逃している、または理解していないものはありますか?FutureTask をサブクラス化する必要があるかもしれません。
ご協力いただきありがとうございます、