【问题标题】:New thread and calling thread will be blocked Java Semaphore新线程和调用线程将被阻塞 Java Semaphore
【发布时间】:2015-10-13 06:11:21
【问题描述】:

我的 java swing 程序有些问题。当ExportWithoutEntryPointFrm Frame 出现在自己的线程中时,我尝试停止我的主 Frame 线程。 我用java.util.concurrent.Semaphore 实现了它。 出现的 Frame 只显示一个空 Frame,按钮、标签等不会显示,并且两个线程都被阻塞。我认为有一个死锁,但我没有找到它。

我的新警告框架代码,将从主框架调用:

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();

【问题讨论】:

    标签: java swing concurrency semaphore


    【解决方案1】:

    首先,调用 Runnable 的 run() 方法不会启动新线程。

    其次,即使是这样,也必须仅从事件调度线程中使用像 JFrame 这样的 Swing 组件。

    第三:因为一切都是从一个线程,EDT,只要这行被执行:

    waitForDecisionSema.acquire();
    

    EDT 被阻塞,等待其他线程释放信号量,而这永远不会发生,因此 EDT 被永远阻塞,使您的 GUI 无响应。

    您真的需要重新考虑您的设计。但我不知道你想要达到什么目标,所以很难给出建议。鉴于您的信号量的名称,我认为您正在寻找的是一个模态 JDialog,它会阻止用户使用对话框的父框架,直到对话框关闭。

    【讨论】:

      【解决方案2】:

      当 ExportWithoutEntryPointFrm Frame 出现在自己的线程中时,我尝试停止我的主 Frame 线程

      嗯,这是一个巨大的矛盾,Swing 是一个单线程框架,你可以在单独的线程中操作组件/框架/窗口,它不会工作,你最终会遇到无穷无尽的问题,死锁是最明显的。

      首先查看Concurrency in Swing了解更多详情。

      现在,您可以使用多种机制将长时间运行或阻塞的代码卸载到单独的线程并仍然与 Swing 交互,Swing Timer 用于定期调度回调,SwingWorker 用于长时间运行或潜在阻塞调用,但它支持对 EDT 的回调,使其易于使用,甚至在您别无选择的时候SwingUtilities.invokeLater

      查看How to use Swing TimersWorker Threads and SwingWorker 了解更多详情

      不过,根据您的描述,我建议您真正想要的是一个模态对话框,它将在对话框可见时阻止当前帧/代码执行,但允许 UI 继续响应给用户。

      详情请见How to Make Dialogs

      【讨论】:

      • 感谢您的帮助。这就是我要找的。​​span>
      猜你喜欢
      • 2013-11-16
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      相关资源
      最近更新 更多