繁体   English   中英

为什么当计数变为零时,CountDownLatch有时不释放线程?

[英]Why CountDownLatch sometimes doesn't release threads when count gets to zero?

我正在构建一个简单的对话框,可以通过按按钮或Esc按钮将其关闭。 我在关闭对话框之前使用CountDownLatch等待,并从各种侦听器中调用.countDown()

我遇到了以下问题-在窗口上按“ X”调用.countDown()并导致对话框被.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");
    }

}

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

尝试:

final StrangeDialog dialog = new StrangeDialog(null);
SwingUtilities.invokeLater(new Runnable() { public void run() { dialog.setVisible(true); } });

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM