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

私の質問は、前と後の実行フックを呼び出すときに、呼び出し可能なタスクに保持されている情報を取得する方法です。または、スレッドプールの各スレッドに特定の名前を付けることは可能ですか?

Runnable オブジェクト/FutureTask/callable に隠されているデバッグ モードの Eclipse 変数ビューに情報があることがはっきりとわかります。

メソッド (beforeExecute、afterExecute) を Runnable オブジェクトでオーバーライドし、Callable オブジェクトをオーバーライドする必要がない理由がわかりません (結果を取得する必要があるため)。私が見逃している、または理解していないものはありますか?FutureTask をサブクラス化する必要があるかもしれません。

ご協力いただきありがとうございます、

4

1 に答える 1

0

andDoTaskをオーバーライドするのではなく、各呼び出しの前後に何かを実行したい場合は、スーパークラス化する方が簡単です。beforeExecuteafterExecute

編集: また、callable を使用している場合は、ExecutorService.

于 2011-10-06T12:38:40.233 に答える