gpt4 book ai didi

java - 无法解释的 Java 诡计——可能与线程有关?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:57:15 25 4
gpt4 key购买 nike

问题

作为大学项目的一部分,我目前正在使用 Swing GUI 使用 Java(在 Eclipse 中)构建生命游戏模拟器。除了一个小缺陷外,一切进展顺利 -

它适用于我的上网本,但不适用于我尝试过的任何其他 PC。这是在 Ubuntu 下。

一些结构大纲——我有一个模型、一个 View 和一个 Controller 。我还没有正确定义模型,但我已经完成了 View (GUI 部分)并启动了 Controller 。通过Main方法运行Controller,然后Controller在单独的线程中创建View类,进入while循环。

View 实现了一个“订单”队列,它从用户输入、鼠标点击等等接收到这些订单。 Controller 在 while 循环的迭代中从队列中挑选出这些订单,并在必要时执行它们。

但是,虽然代码在我的上网本(最新版本,Java 1.6.0_20)上运行良好,但它在我的 PC(又是最新版本,Java 1.6.0_20)或大学 PC(karmic,一些以前的Java 版本)。一旦遇到“getNextCommand”方法,它就会停止。没有错误,它只是拒绝打印/遵守

源文件位于此处 - http://www.mediafire.com/?dfwtdkj1tdxd5xl感兴趣的文件是 Controller 和 View。

例子

在 View 中,我有这个功能:

public Command getNextCommand() {
System.out.println(commands.getFirst().id);
return commands.pop();
}

非常不言自明,当 Controller 调用 getNextCommand() 时,它会打印出那是什么命令。

这是 Controller 中的 while 循环:

while(!stop) {
if (gui.hasCommand()){
order = gui.getNextCommand();
//System.out.println("Something");
//if(order.id.equals("stop")) { stop = true; }
}
}

这很好用。如您所料,它会在 getNextCommand 中打印。

虽然取消注释这两个语句中的任何一个,它突然停止工作。不再为您打印!

为什么会这样?为什么这可以在我的上网本上运行,但不能在我的 PC 上运行? :C

补充说明

此外,如果我运行 Eclipse 生成的 .class 文件,它会打印(假设这两行已被注释掉)。如果我自己使用 javac 编译它们,则不会打印任何内容。

如有任何见解,我们将不胜感激!

谢谢,

卢克。

编辑

如果我在调用 getNextCommand 时返回一个 Integer 而不是返回一个 Command(一个带有 id (String)、x,y (int) 和 value (int) 的简单容器类),则会出现同样的问题。或其他任何内容。

最佳答案

嗯,这是多线程问题的典型案例,因为您从不同的线程调用 View 和 Controller 。假设您的命令容器未同步。

可能发生的情况是,命令更新由一个线程完成,但其他线程没有注意到它,因为更新不在同步块(synchronized block)内。将其视为在不同 CPU 缓存上工作的两个线程 - 当一个线程写入时,另一个线程看不到它,除非它导致缓存被刷新到主内存中 - 这仅在调用 synchronized 时发生。

更多信息:http://gee.cs.oswego.edu/dl/cpj/jmm.html

快速解决方案:使用 java.util.vector 代替 LinkedList

关于java - 无法解释的 Java 诡计——可能与线程有关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4762164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com