Java 为什么倒计时锁有时不';当计数为零时,是否释放线程?

Java 为什么倒计时锁有时不';当计数为零时,是否释放线程?,java,swing,Java,Swing,我正在创建一个简单的对话框,可以通过按下按钮或Esc按钮来取消该对话框。我使用CountDownLatch等待,然后关闭对话框,并从各种侦听器调用了.countDown() 我遇到了以下问题-在窗口上按“X”调用.countDown(),并导致对话框取消,而按按钮则导致调用相同的代码,但线程不会继续执行。有什么问题吗 可编译/可运行示例: import java.util.concurrent.CountDownLatch; import javax.swing.JFrame; public

我正在创建一个简单的对话框,可以通过按下按钮或
Esc
按钮来取消该对话框。我使用CountDownLatch等待,然后关闭对话框,并从各种侦听器调用了
.countDown()

我遇到了以下问题-在窗口上按“X”调用
.countDown()
,并导致对话框取消,而按按钮则导致调用相同的代码,但线程不会继续执行。有什么问题吗

可编译/可运行示例:

import java.util.concurrent.CountDownLatch;
import javax.swing.JFrame;

public class StrangeDialog extends javax.swing.JDialog {

    final CountDownLatch latch = new CountDownLatch(1);

    public StrangeDialog(JFrame parent) {
        super(parent, true); // removing this line fixes things

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosed(java.awt.event.WindowEvent evt) {
                System.out.println(latch);
                latch.countDown();
            }
        });

        setFocusable(true);
        addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent e) {
                System.out.println(latch);
                latch.countDown();
            }
        });

        setSize(100,100);
        setVisible(true);
    }

    public static void main(String[] args) {
        StrangeDialog dialog = new StrangeDialog(null);
        try {
            dialog.latch.await();
        } catch (InterruptedException ex) {
        }
        dialog.setVisible(false);
        System.out.println("Released");
    }

}

您正在创建一个模态对话框。基本上,代码不会超过
奇异对话框=新奇异对话框(null)直到窗口关闭

尝试:


在main()中打开窗口,它将按预期工作。

您正在创建一个模式对话框。基本上,代码不会超过
奇异对话框=新奇异对话框(null)直到窗口关闭

尝试:


在main()中打开窗口,它将按预期工作。

是否有原因不关闭转义键事件处理程序中的对话框?此外,实际上并不需要窗口侦听器,因为您已经将其默认关闭操作指定为
DISPOSE\u ON\u close
。这只是使用
CountDownLatch
的一个练习吗?WindowListener需要调用撤销逻辑,即.countDown。如果在等待对话框关闭时需要使用
CountDownLatch
冻结不同的线程,那么是的,
WindowListener
逻辑是必需的。但是,另一个线程不需要告诉对话框关闭-对话框本身可以处理该逻辑。即使您坚持让另一个线程发起关闭对话框,您仍然需要通过调用
SwingUtilities.invokeLater(new Runnable(){public void run(){dialog.dispose();}}})在事件调度线程上执行该操作是否有理由不关闭转义键事件处理程序中的对话框?此外,实际上并不需要窗口侦听器,因为您已经将其默认关闭操作指定为
DISPOSE\u ON\u close
。这只是使用
CountDownLatch
的一个练习吗?WindowListener需要调用撤销逻辑,即.countDown。如果在等待对话框关闭时需要使用
CountDownLatch
冻结不同的线程,那么是的,
WindowListener
逻辑是必需的。但是,另一个线程不需要告诉对话框关闭-对话框本身可以处理该逻辑。即使您坚持让另一个线程发起关闭对话框,您仍然需要通过调用
SwingUtilities.invokeLater(new Runnable(){public void run(){dialog.dispose();}}})在事件调度线程上执行该操作你是对的,但是一个小的加法-它没有通过
setvisable(true)
,特别是。你是对的,但是一个小加法-它没有通过
setvisable(true)
final StrangeDialog dialog = new StrangeDialog(null);
SwingUtilities.invokeLater(new Runnable() { public void run() { dialog.setVisible(true); } });