ひとつのスレッドがJavaの同期関数内で実行していて、別のスレッドが同じメソッドにアクセスしたいとしますが、最初のスレッドが完了するまで待たなければならないとしましょう。 2番目のスレッドは、どのスレッドがそのオブジェクトに対してロックを持っているかを知ることができます。 私は最初のスレッドの詳細を印刷したいかもしれません。おそらく、最初のスレッドが開始された場所から印刷したいと思います。オブジェクトのロックを持つスレッドの詳細を取得する方法
1
A
答えて
2
java.util.concurrent.locks.ReentrantLock
を使用している場合、サブクラスはgetOwner
を呼び出すことができます。
また、JMXを使用することもできます。スレッドを繰り返して、java.lang.management.ThreadInfo
と適切なgetLockedMonitors()
またはgetLockedSynchronizers()
を見つけてください。
0
私はそれができないと信じています。あなたには、いくつかの余分なコーディングで似たような行うことができますしかし:
public void myFunction() {
System.out.println("" + Thread.currentThread() + " entering sync @ myFunction");
synchronized(this) {
System.out.println("" + Thread.currentThread() + " entered sync @ myFunction");
...
System.out.println("" + Thread.currentThread() + " leaving sync @ myFunction");
}
System.out.println("" + Thread.currentThread() + " left sync @ myFunction");
}
2
をそれはトムホーティンが書いたが、dumpAllThreadsでThreadInfoにを取得するときに、モニター情報を明示的に要求しなければならない、ほとんど何、少しトリッキーです。以下のような 何か:
Object lock = ...
ThreadMXBean mx = ManagementFactory.getThreadMXBean();
ThreadInfo[] allInfo = mx.dumpAllThreads(true, false);
for (ThreadInfo threadInfo : allInfo) {
MonitorInfo[] monitors = threadInfo.getLockedMonitors();
for (MonitorInfo monitorInfo : monitors) {
if (monitorInfo.getIdentityHashCode() == System.identityHashCode(lock)) {
StackTraceElement[] stackTrace = threadInfo.getStackTrace();
// use the the Information from threadInfo
}
}
}
1
は、診断目的のためにこれは、またはそれはあなたのアプリケーションの一部として使用したい機能のためです。それが診断のためのものであれば、ここでの他の回答のさまざまな冗長なロギングソリューションが、おそらくあなたを動かすのに十分です。機能の一部としてこれを実行する場合は、キーワードよりも堅牢で柔軟なものを使用するべきです(例えば、@ Tomで述べたReentrantLock
ウィザードなど)。
関連する問題
- 1. マスター/詳細テーブルの詳細テーブルの最後のレコードを取得する方法
- 2. socket.ioのミドルウェアでイベントの詳細を取得する方法
- 3. twitterで現在のユーザーの詳細を取得する方法
- 4. デバイスのGPSの詳細を取得する方法
- 5. 設定済みのメールアカウントの詳細を取得する方法
- 6. データベースからデータの詳細を取得する方法は?
- 7. SSRSレポートサーバーデータベース「TABLE」の詳細を取得する方法は?
- 8. WMIでFireWireの詳細を取得する方法は?
- 9. civicrmでタグの詳細を取得する方法は?
- 10. magentoデータベースの詳細を取得する方法
- 11. タイムゾーンから国の詳細を取得する方法は?
- 12. pidからプロセスの詳細を取得する方法
- 13. 取得IIS7.5詳細PowerShellの
- 14. windbgのclrstack出力からオブジェクトの詳細を取得
- 15. 複数の詳細バンドを持つJasperReports
- 16. 複数の値を持つプロファイルの詳細を保存する方法は?
- 17. スレッドスケジューリング - スレッドが通知後にロックを取得する方法
- 18. Intent of a PendingIntentの詳細を取得
- 19. Pythonで例外の詳細を取得
- 20. Javaでユーザーコミットの詳細を取得
- 21. Facebook API:ユーザープロフィールの詳細を取得
- 22. Dropbox java apiファイルの詳細を取得
- 23. URLからポートプロトコルの詳細を取得
- 24. wcfでNetworkCredentialの詳細を取得
- 25. 詳細情報のための複数のXibを持つ詳細DetailViewのデータアクセス
- 26. JMSキューのMessageReceiversの詳細を取得する方法(JBoss AS6にHornetQをデプロイ)
- 27. ネットワーク上の他のPCからファイルの詳細を取得する方法
- 28. C#を使用してDB2テーブルの詳細を取得する方法
- 29. Jossoでは、 "josso_assertion_id"を使用してユーザーの詳細を取得する方法
- 30. listviewの名前から連絡先の詳細を取得する方法