3

やや非正統的な状況 - 基本的に、スレッド A がスレッド B を監視しています。スレッド A が、スレッド B が担当する定期的なタスクの 1 つを検出した場合 (スレッド B は a の一部ではなくThreadPoolExecutor、MINA のスレッドの 1 つです)、スレッド A は古くなりました。その上でエラーを報告します。したがって、これらのエラーが発生しているため、スレッド B がどこで詰まっているかを知りたいと考えています。したがって、スレッド A がスレッド B を呼び出しgetStackTrace()てスタックを出力するのが賢明なようです。

実際には、タスクが実行されていない場合、スレッド B がブロックされているため、スレッド B のスタックがかなりの時間変更されていない可能性があるため、これをわずかに実行しても問題ありません。しかし、理論上、また実際には、スレッド A がスタック トレースを取得しようとすると、スレッド B のスタックが変化することがあります。したがって、これがスレッドセーフな操作であるかどうか疑問に思っています。

4

1 に答える 1

5

そのソースコードを見ると、メソッドを使用してThreadいるようです。同じメソッドがThread.getAllStackTraces()によって使用されます。これは、javadocによるとスレッドセーフです。getStackTrace()private static native dumpThreads()

このメソッドが呼び出されている間、スレッドが実行されている可能性があります。各スレッドのスタックトレースはスナップショットのみを表し、各スタックトレースは異なる時間に取得される場合があります。仮想マシンにスレッドに関するスタックトレース情報がない場合、長さゼロの配列がマップ値に返されます。

于 2012-11-21T16:53:56.187 に答える