Java没有';在Linux中运行时不会中断一段时间

Java没有';在Linux中运行时不会中断一段时间,java,linux,while-loop,Java,Linux,While Loop,我发现了一个关于家庭作业的Java代码的神秘问题。一个朋友程序在开始时会启动一个应用程序: public void run() { vm.setVisible(true); while(!end); System.out.println("Finish"); vm.setVisible(false); } 在所有执行过程中以及当用户退出应用程序时,布尔值“end”为false: private class CloseSys implements ActionLi

我发现了一个关于家庭作业的Java代码的神秘问题。一个朋友程序在开始时会启动一个应用程序:

public void run() {
    vm.setVisible(true);
    while(!end);
    System.out.println("Finish");
    vm.setVisible(false);
}
在所有执行过程中以及当用户退出应用程序时,布尔值“end”为false:

private class CloseSys implements ActionListener {
    public CloseSys() {super();}

        public void actionPerformed(ActionEvent e) {
        System.out.println("CLOSE SYS");
        System.out.println("end: "+end);
        end = true;
        System.out.println("end: "+end);
    }
}
println在我朋友的计算机(MacOS)中显示为true,而在finish和应用程序中也显示为true


问题是,在我的计算机(Ubuntu Linux)中,println也显示为值更改,但while没有结束(从未达到“Finish”println)。有趣的是如果我们把指纹放进。。。那就行了

尝试使
end
变量不稳定-您已经被多线程问题困扰(并且您有一个多核CPU)


这里有一些信息:

end
必须是
volatile
,因为它在两个线程之间共享

看起来像是线程问题

尝试将
end
声明为
volatile
,或者最好还是使用
countdownlock
,因为这样可以避免占用CPU:

private CountDownLatch latch;

public void run() {
    try {
        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                vm.setVisible(true);
            }
        });
        try {
            latch.await();
            System.out.println("Finish");
        } finally {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    vm.setVisible(false);
                }
            });
        }
    } catch (InterruptedException ex) {
        System.out.println("Interrupt");
        Thread.currentThread().interrupt();
    } catch (InvocationTargetException ex) {
        throw new RuntimeException(ex);
    }
}

private class CloseSys implements ActionListener {    
    public void actionPerformed(ActionEvent e) {
        System.out.println("CLOSE SYS");
        latch.countDown();
    }
}

请注意使用
invokeAndWait
从非EDT线程更改窗口可见性。

其他一些人提到它应该是易失性的。有一件事似乎还没有人提到,那就是你在“忙着等待”,这是错误的,错误的,错误的。如果您想等待另一个线程中的事件发生,您应该使用同步锁或。

注意,您不应该在AWT事件调度线程(EDT)之外使用Swing(或实际上是AWT)。为什么需要倒计时闩锁?为什么不仅仅是Object.wait()?volatile可以工作,不幸的是,我现在没有时间尝试倒计时锁存器,但我很快就会尝试。@Sergey Tachenov,
Object.wait
是一种低级方法,有缺陷,例如
notify
-vs-
notifyAll
,虚假唤醒。你可以解决这个问题,但是你会重新发明轮子。谢谢你,这解决了问题:)我把你标记为解决了,因为我认为你是第一个答案。我不知道这是否是一种方法。我以大约17秒的优势领先,但这很公平;-)