Java没有';在Linux中运行时不会中断一段时间
我发现了一个关于家庭作业的Java代码的神秘问题。一个朋友程序在开始时会启动一个应用程序: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
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秒的优势领先,但这很公平;-)