[英]New thread and calling thread will be blocked Java Semaphore
我的java swing程序遇到一些麻煩。 當ExportWithoutEntryPointFrm
框架出現在自己的線程中時,我嘗試停止我的主框架線程。 我用java.util.concurrent.Semaphore
實現了這一點。 出現的“框架”僅顯示一個空框架,按鈕,標簽等將不會顯示,並且兩個線程均被阻塞。 我認為這是一個僵局,但我找不到。
我的新警告框架代碼,將從主框架中調用:
public class ExportWithoutEntryPointFrm extends javax.swing.JFrame implements Runnable
{
private Semaphore sema;
private boolean decision = false;
public ExportWithoutEntryPointFrm(Semaphore semaphore)
{
initComponents();
this.setLocationRelativeTo(null);
this.sema = semaphore;
}
@Override
public void run()
{
this.setVisible(true);
try
{
sema.acquire();
}
catch (InterruptedException e)
{
this.decision = false;
this.sema.release();
this.setVisible(false);
}
}
}
以及來自主框架的調用代碼:
Semaphore waitForDecisionSema = new Semaphore(1, true);
ExportWithoutEntryPointFrm warningFrm = new ExportWithoutEntryPointFrm(waitForDecisionSema);
warningFrm.run();
waitForDecisionSema.acquire();
首先,調用Runnable的run()方法不會啟動新線程。
其次,即使這樣做,也必須僅從事件分發線程中使用Swing組件(如JFrame)。
第三:由於所有操作都是從單個線程完成的,因此在執行此行后,EDT就會立即執行:
waitForDecisionSema.acquire();
EDT被阻止,等待其他線程釋放信號,這將永遠不會發生,因此EDT被永久阻止,從而使GUI無響應。
您非常需要重新考慮您的設計。 但是我不知道您要達到什么目標,因此很難提出建議。 給定信號量的名稱,我認為您正在尋找的是模式JDialog,它將阻止用戶使用對話框的父框架,直到對話框關閉。
當ExportWithoutEntryPointFrm框架出現在自己的線程中時,我嘗試停止我的主框架線程
好吧,這是一個巨大的矛盾,Swing是一個單線程框架,您可以在單獨的線程中操作組件/框架/窗口,它將無法正常工作,並且您將無休無止,死鎖是最多的明顯。
現在,您可以使用多種機制將長時間運行或阻塞的代碼卸載到單獨的線程上,並仍與Swing交互; Swing Timer
用於常規調度的回調; SwingWorker
用於長時間運行或可能阻塞的調用,但支持回調到EDT,在那些時候您別無選擇,甚至易於使用,甚至SwingUtilities.invokeLater
。
看看如何使用Swing計時器和輔助線程以及SwingWorker以獲得更多詳細信息
不過,根據您的描述,我建議您真正想要的是一個模式對話框,它將在顯示對話框的那一刻阻止當前幀/代碼的執行,但將允許UI繼續響應用戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.