2013-03-18 16 views
7

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

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

スレッドの開始時間を判断する方法はありますか?または、2つの時間メソッドのどちらかが、スレッドがアクティブであった時間を返しますか?

+2

関連してください:[http://stackoverflow.com/questions/9874641/tracking-java-thread-creation-and-lifetime](スレッドの作成およびライフタイム) – Jayan

+0

関連:[http://stackoverflow.com/questions/12491112/thread-creation-listener](スレッド作成リスナー) –

+0

'ThreadLocal'を使用して、' Thread'の開始時刻を保存できます。 –

答えて

1

これはX-Yの問題でしょうか?

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

私は、スレッドが開始時期を決定する方法を知りません。しかし、私はそれが本当に関連性のある情報であるかどうかはわかりません。パフォーマンスをプロファイルしようとしていますか?パフォーマンスの低下の指標として長時間実行スレッドを使用しようとしていますか?

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

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

0

あなたがあなた自身のThreadサブクラスを定義する能力を持っている場合、あなたはこのような何かを行うことができます:

class WugThread extends Thread 
{ 
    // constructors 

    long timeStarted = -1; 

    public void start() 
    { 
     super.start(); 
     timeStarted = System.currentTimeMillis(); 
    } 
} 
+0

明らかに、スレッドが開始されたときに必ずしも正確に反映されるとは限りませんが、スレッドが実際に実行を開始してから数ミリ秒後に、この情報を追跡するのがはるかに簡単な方法です。 – Wug

+2

OPは彼がこれをすることができないと言いました。 – Brandon

+0

今後、質問を見つけた人の参考にして回答を残しておきます。スレッドのシステム実装をこれをサポートしているものに置き換えることを含む、本当に厄介なことをやっていないと、あなたはおそらく何らかの問題を抱えているでしょう。 getThreadCpuTimeは、スレッドがCPU上で動作する合計時間(カーネル時間を含む)を返し、getThreadUserTimeは、スレッドがCPU上のユーザーランドで過ごした合計時間を返します。あなたが正しいです、睡眠時間はここに表示されません。 – Wug

1

あなたがスレッドを拡張することができないかもしれないが、あなたがインターセプトにアスペクト指向プログラミングを使用してに見ることができます新しいRunnableが起動し、その時点で開始時刻を記録します。

AspectJの/春AOPを見

関連する問題