1

アプリケーションがそのコード内のさまざまな場所 (参照されている jar 内を含む) で ( usingnew Thread()および using のように) 多くのスレッドを開始する場合ExecutorService、特定のスレッドを開始したソース コードを特定する最善の方法は何ですか (実行中のスレッドで見られるように)。アプリケーションのインスタンス)

これは、たとえば、スレッドがException- を引き起こし、(コンテキストが明確になるように) スレッドが初期化されたソース コードから始める必要がある場合に役立ちます。VisualVM から取得したスレッド ダンプには、多くの実行中/待機中のスレッドが表示されます。しかし、スタックルートは常にあるようですat java.lang.Thread.run(Thread.java:722)-あまり役に立ちません。`

4

3 に答える 3

0

できることは、開始するすべてのスレッドにThread.uncaughtExceptionhandlerを設定することです。次のメソッドがあります。

uncaughtException(Thread t,Throwable e)

この内部には、このコードがどこから呼び出されたかを後で特定できるログまたは何かを入れることができます。もちろん、すべてのスレッドに対して、起点として個別に指定する必要があります。

でグローバルなものを設定できますThread.setDefaultUncaughtExceptionHandler(myHandler);。しかし、それを区別するために、おそらく ThreadGroup か何かを持っています。

ただし、参照された Jar によってスレッドが開始された場合、これはすべて役に立ちません。

于 2013-04-08T18:41:16.267 に答える
0

スレッドが作成されているポイントにコードを挿入できますか? その場合は、メイン クラスに static HashMap を public static put メソッドと共に作成します。次に、スレッド t1 を作成するたびに Main.putThreadId(t1.getId(), "スレッドを作成しているメソッドを識別するテキスト") を呼び出し、例外をキャッチしたら HashMap の値を調べます。

于 2013-04-08T18:28:56.487 に答える
0

前に示したマップ アプローチを使用できますが、テキストの代わりにException、スレッドを作成した時点で新しい を生成します。この例外を値としてマップに入れます。必要に応じて、後でスタック トレースを取得できます。Executors の場合、ワーカー スレッドの作成でこれを非表示にすることができますThreadFactory

この問題は、s を使用する場合にも同様に発生しRunnableます。Runnableメソッドで始まるスタック トレースの上で、 が作成されてキューに入れられた場所を知りたい場合がありますrun

もちろん、レガシー コード全体と参照される jarの問題は次のとおりです。コーディングが必要な問題を解決したいが、コーディングは必要ありません。簡単ではありません :)

于 2013-04-08T21:11:52.310 に答える