gpt4 book ai didi

java - 新线程和调用线程都会被阻塞 Java Semaphore

转载 作者:行者123 更新时间:2023-12-01 16:55:46 26 4
gpt4 key购买 nike

我的 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() 方法不会启动新线程。

其次,即使确实如此,像 JFrame 这样的 Swing 组件也必须仅在事件调度线程中使用。

第三:由于一切都是从单个线程(EDT)完成的,因此只要执行此行:

waitForDecisionSema.acquire();

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

您确实需要重新考虑您的设计。但我不知道你想达到什么目的,所以很难提供建议。考虑到信号量的名称,我认为您正在寻找的是模态 JDialog,它将阻止用户在对话框关闭之前使用对话框的父框架。

关于java - 新线程和调用线程都会被阻塞 Java Semaphore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33095344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com