概述在Linux中运行Java不会有一段时间
我发现一个Java代码作业的神秘问题。 一个朋友编程这个开头的应用程序:
public voID run() { vm.setVisible(true); while(!end); System.out.println(\”Finish\”); vm.setVisible(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在完成和应用程序中显示像\’end\’的值在我的朋友的计算机(MacOS)中真实和逻辑地转换。
问题是,在我的电脑(Ubuntu的linux)的println也显示像价值的变化,但一段时间没有结束(“完成”println永远不会到达)。 有趣的是,如果我们把印刷品放在一边…然后工作!
用于Ubuntu 10.10的Eclipse 3.6 Helios
Java Process的常驻内存使用量(RSS)不断增长
SocketoutputStream的线程安全性
如何将jar输出从ubuntu命令提示符redirect到文本文件
LWJGL自动原生select器
AWT机器人不能拖动窗口
什么会导致closures(2)与EIO失败的只读文件?
从java程序closuresIE进程
向exec发送一个cmdarray来处理 – hello world
Tomcat:未能parsing运行时描述符
end必须是volatile因为它在两个线程之间共享!
其他几个人提到它应该是不稳定的。 有一点似乎没有人提到,就是你“忙着等待”,这是错的,错的,错的错。 如果你想等待另一个线程发生什么事情,你应该使用同步锁或信号量 。
尽量让end变量易变 – 你已经被多线程问题困扰了(并且你有一个多核cpu)。
这里有一些信息: http : //www.javamex.com/tutorials/synchronization_volatile_when.sHTML
它看起来像一个线程问题。
尝试将end声明为volatile ,或者更好地使用CountDownLatch因为这可以避免占用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 ActionListner { public voID actionPerformed(ActionEvent e) { System.out.println(\”CLOSE SYS\”); latch.countDown(); } }
请注意使用invokeAnDWait来更改来自非EDT线程的窗口可见性。
总结
以上是内存溢出为你收集整理的在Linux中运行Java不会有一段时间全部内容,希望文章能够帮你解决在Linux中运行Java不会有一段时间所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容