7

長時間実行されているジョブを監視するために、JVM 内で実行中のスレッドの分析を作成するように依頼されました。Javaスレッドの開始日時を見つける方法はありますか? スレッドを取得するのに問題はありませんが、スレッドがアクティブになっている時間やスレッドがいつ開始されたかを調べる方法がわかりません。スレッドを取得するには、単に ThreadGroup を列挙しています。

私は実際のスレッド自体を制御できないことに注意してください。そのため、時間やプロパティを入力して開始時間を自分で記録することはできません。私が持っているのは実際のスレッド自体であり、そこからデータを決定する必要があります。スレッド上に「getThreadCpuTime()」と「getThreadUserTime()」の 2 つのメソッドを見つけることができますが、明らかにスレッドが sleep() メソッドを呼び出すことがあると思われるため、これらで十分かどうかはわかりません。 「スリープ」時間は、これらの方法のいずれにも含まれません。

スレッドの開始時間を決定する方法はありますか? それとも、2 つの時間メソッドのいずれかが、スレッドがアクティブであった時間を返すのでしょうか?

4

3 に答える 3

1

これはXY問題でしょうか?

http://www.perlmonks.org/index.pl?node_id=430320

スレッドがいつ開始されたかを判断する方法がわかりません。しかし、それが本当に関連性のある情報かどうかはわかりません。パフォーマンスのプロファイルを作成しようとしていますか?パフォーマンスの低下を示すものとして、長時間実行されるスレッドを使用しようとしていますか?

それに関する問題は、スレッドが常に再利用されることです。TomcatはAJPスレッドとHTTPスレッドをプールします。新しいリクエストを受信すると、スレッドはループから抜け出し、何らかのアクションを実行してから、待機状態に戻ります。スレッド全体ではなく、そのアクションを測定する必要があります。

別の例として、ガベージコレクタスレッドを取り上げます。これは、JVMの起動時に開始されるため、常に長時間実行されるスレッドになります。

于 2013-03-18T14:38:56.540 に答える
1

Thread を拡張できない場合でも、Aspect Oriented Programming を使用して新しい Runnable の起動をインターセプトし、その時点での開始時刻をログに記録することを検討できます。

AspectJ / Spring AOPを見てみましょう

于 2013-03-18T14:49:38.593 に答える
0

独自のサブクラスを定義する機能がある場合は、次のThreadようにすることができます。

class WugThread extends Thread
{
    // constructors

    long timeStarted = -1;

    public void start()
    {
        super.start();
        timeStarted = System.currentTimeMillis();
    }
}
于 2013-03-18T14:40:43.093 に答える