3

私はこれを理解することを可能にする何かを一緒にハックできると確信していますが、私がちょうど欠けているすぐに使える解決策があることを望んでいます。ドキュメントを読みましたが、何も表示されませんでした。

私の特定のアプリは、にThreadPoolExecutor裏打ちされたものを使用しDelayQueueていますが、それが重要かどうかはわかりません。

ありがとう!

4

3 に答える 3

10

1つの簡単なアプローチ:新しいタスクの開始を通知するコールバックを呼び出すコードでタスクをラップし、必要なすべてのデータを渡します。

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();
    }
}
于 2011-01-05T22:07:26.233 に答える
6

これを行うための信頼できる方法はないと思います。カウントが必要な場合は、役立つメソッド(getTaskCount()/ getCompletedTaskCount())があります。実際のタスクが必要な場合は、beforeExecute()とafterExecute()をオーバーライドすることで、タスクを手動で追跡する必要があります。これは1つの方法です。

于 2011-01-05T22:20:21.757 に答える
1

実際に実行時に知る必要がありますか、それともデバッグのためだけに知る必要がありますか?

デバッグしているだけの場合は、JVisualVMアプリケーション(JDKの「bin」ディレクトリにインストールされている)を確認することを検討してください。実行中のすべてのスレッドを動的に検査できるため、ある程度の洞察を提供できるはずです。

(JVisualVMは、実行と割り当てのホットスポットを使用してCPU /メモリプロファイリングを実行することもでき、ガベージコレクションアクティビティをリアルタイムで表示します。)

于 2011-01-05T22:13:09.620 に答える