私はこれを理解するために一緒に何かをハックすることができると確信していますが、私はちょうど行方不明のすぐに解決策があることを望んでいます。私はドキュメントを読んだが、何も見なかった。Java Executorが実行中のタスクを特定の時点で簡単に知る方法はありますか?
私の特定のアプリは、DelayQueue
に裏打ちされたThreadPoolExecutor
を使用していますが、それは問題ではありません。
ありがとうございます!
私はこれを理解するために一緒に何かをハックすることができると確信していますが、私はちょうど行方不明のすぐに解決策があることを望んでいます。私はドキュメントを読んだが、何も見なかった。Java Executorが実行中のタスクを特定の時点で簡単に知る方法はありますか?
私の特定のアプリは、DelayQueue
に裏打ちされたThreadPoolExecutor
を使用していますが、それは問題ではありません。
ありがとうございます!
私はこれを行うには信頼性の高い方法はないと思います。カウントが必要な場合は、利用可能なメソッド(getTaskCount()/ getCompletedTaskCount())があります。実際のタスクが必要な場合は、beforeExecute()およびafterExecute()をオーバーライドすることによって、タスクを追跡するためにAFAIKを手動で実行する必要があります。
一つの簡単なアプローチ:あなたはそれをお勧めしますすべてのデータを渡して、コールバック新しいタスクの開始を知らせる呼び出すコードを使用してタスクをラップ:
interface StartTaskWatcher {
void taskStarted(Object data);
}
class StartTaskSignalingWrapper implements Runnable {
private final Runnable task;
private final String taskDescription;
private final StartTaskWatcher startTaskWatcher;
StartTaskSignalingWrapper(Runnable task, String taskDescription, StartTaskWatcher startTaskWatcher) {
this.task = task;
this.taskDescription = taskDescription;
this.startTaskWatcher = startTaskWatcher;
}
public void run() {
startTaskWatcher.taskStarted(taskDescription);
task.run();
}
}
良い提案、良いコード、ありがとう! –
、あなたが実際に実行時に知っておく必要がありますかちょうどデバッグのために?
デバッグしている場合は、JVisualVMアプリケーション(JDKの 'bin'ディレクトリにインストールされています)を確認してください。実行中のすべてのスレッドを動的に検査できるため、いくつかの洞察を提供することができます。
(JVisualVMも実行&割り当てホットスポットで、CPU /メモリのプロファイリングを行い、リアルタイムでガベージコレクションの活性を示すことができます。)
私は実際に、監視とトラブルシューティングのために、実行時にそれが必要です。良い情報ですが、ありがとう! –
非常に直接的で、私の質問に直接答えます。ありがとう! –