簡體   English   中英

新線程和調用線程將被阻塞Java信號量

[英]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交互; Swing Timer用於常規調度的回調; SwingWorker用於長時間運行或可能阻塞的調用,但支持回調到EDT,在那些時候您別無選擇,甚至易於使用,甚至SwingUtilities.invokeLater

看看如何使用Swing計時器輔助線程以及SwingWorker以獲得更多詳細信息

不過,根據您的描述,我建議您真正想要的是一個模式對話框,它將在顯示對話框的那一刻阻止當前幀/代碼的執行,但將允許UI繼續響應用戶。

有關更多詳細信息,請參見如何制作對話框

暫無
暫無

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

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