1

我有2节课。当您单击特定位置时,第一个类将布尔值变为 true,如果第一个类中的布尔值为 true,则第二个类调用 frame.removeAll()frame.add(new CanvasSelect())。似乎只检查布尔值一次。

有什么办法可以让二等舱不断检查一等舱的布尔值吗?

4

3 回答 3

3

正如评论中所建议的那样,如果您真的想知道发生了什么,您确实需要发布(精简版)代码。我可以想到这可能发生的三个可能原因。

可能性 1:您需要将布尔值标记为volatile. 如果这里有多个线程在运行,那么如果该字段未标记为易失性字段,则其中一个线程可能会看到陈旧的值。但是,听起来您正在做 GUI 编程(可能使用 Swing),所以所有这些事件都应该发生在 GUI 事件线程中——因此我怀疑这是问题所在。不过,它仍然值得一试。

可能性 2:您正在根据布尔值设置事件处理程序,而不是检查事件处理程序中的布尔值。在这种情况下,该值只会被读取一次(当设置 ActionEventHandler 时),而不是在点击事件发生时。

可能性 3:当您清除框架时,您也在使用事件处理程序清除项目,并且您没有正确重置它们。我认为这是最有可能的问题。

于 2012-08-20T05:08:56.483 回答
1

以任何形式使用忙等待(如另一个答案中所建议的)是一个非常糟糕的主意,它是一种编程反模式(它应该只在非常特殊的情况下使用,比如低级 CPU 编程,当然永远不会在 Java 中使用) :

  1. 您只是白白消耗了一个 CPU 的所有可用功率。
  2. 使用sleeping 会更好,但是您的代码会延迟对更改做出反应。而且你做的延迟越短,你浪费的 CPU 功率就越多。尽管如此,这是一种糟糕的编程模式。

如果没有代码片段或更详细的解释,则不清楚您到底想要实现什么。一些一般性建议:

  • 如果您想在收到用户输入时执行某些操作,您可以在事件处理程序中简单地执行此操作,而无需使用任何标志或变量。但是,这只有在您的操作非常短时才有可能,否则您将阻塞事件调度线程
  • 如果您需要执行的操作需要更长的时间,您应该从事件处理程序中启动一个新线程,该线程将执行该操作,并在完成时更新 GUI。最直接的方法是使用SwingWorker。最好阅读整个Swing 中的并发一章以了解所有可能性。
  • 如果您通常需要在两个独立线程之间进行通信,例如如果您需要一个线程等待某些标志更改,请使用Java 的并发机制之一,而不是忙于等待。Guarded Blocks中讨论了如何替换忙等待的最直接方法。
于 2012-08-20T13:15:04.173 回答
0

您可以使用下面给出的代码片段并将它们放入始终与您的主代码并行运行的线程中

while(true)
{
  if(_val)  //_val is your boolean variable
  {
      // your logic
  }
  Thread.sleep(100);

}

或者可以在单击该特定控件时引发事件,该控件检查值_val并执行操作

于 2012-08-20T04:57:22.383 回答