簡體   English   中英

獲取鎖對象線程正在等待

[英]get lock object thread is waiting on

我怎樣才能得到鎖對象線程正在等待?

我有線程轉儲,我可以看到一個SwingWorker使用invokeAndWait()啟動了一個確認對話框,等待用戶交互。
如何以編程方式檢測到這種情況?

    "Some swing worker -1-thread-8", WAITING, prio=5, tid=128
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:485)
        at java.awt.EventQueue.invokeAndWait(EventQueue.java:1038)
        at javax.swing.SwingUtilities.invokeAndWait(SwingUtilities.java:1326)
        at ...
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

不久前,我也發布了類似的答案 技巧是使用JDK提供的管理擴展,以防您對所有正在運行的線程的狀態感興趣。

請參見Thread.holdsLock(Object)方法。

AFAICT這是確定線程是否在特定對象上持有鎖的唯一方法。 我認為沒有一種方法可以以編程方式訪問線程正在等待的對象,而又不知道它可能提前到哪個對象。

基本上,鎖具有等待他的線程列表,此處的鎖是對象的鎖,因此它是Monitor對象。

即使您確實可以訪問該列表(由於並發和安全性原因,這很不巧),也幾乎不可能保證每次都在特定時間獲得正確的列表。

您可能會發現以下打印輸出很有用,請嘗試使用該線程獲取監視程序的列表並在釋放鎖定之前進行打印(例如,監視程序的方法->請參閱getObservedObjects()方法。),並確保每個線程在寫入之前都輸入了他的ID兩者都可能會導致錯誤的臨時值,但結合使用它們會給您指示您的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM