不断检查布尔值

时间:2012-08-20 04:49:32

标签: java

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

有没有办法让第二个类不断检查第一个类中的布尔值?

3 个答案:

答案 0 :(得分:3)

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

可能性1:您需要将布尔值标记为volatile。如果此处存在多个线程,则如果该字段未标记为易失性字段,则其中一个线程可能会看到过时值。但是,听起来你正在进行GUI编程(可能是使用Swing),因此所有这些事件都应该发生在GUI事件线程中 - 因此我怀疑这是问题所在。尽管如此,它仍然值得一试。

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

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

答案 1 :(得分:1)

使用任何形式的忙碌等待(如另一个答案所示)是真的坏主意,它是一个编程anti-pattern(它应该只在非常特殊的情况下使用,比如低级CPU编程,当然也绝不用Java):

  1. 您只需消耗一个CPU的所有可用功率。
  2. sleep更好,但随后您的代码会对延迟做出更改。延迟时间越短,浪费的CPU功率越大。不过,这是一个糟糕的编程模式。
  3. 如果没有代码片段或更详细的说明,目前尚不清楚您想要实现的目标。一些一般性的建议:

    • 如果要在接收用户输入时执行某些操作,可以在事件处理程序中执行此操作,而不使用任何标志或变量。但是,如果您的操作非常短,则可以 ,否则您将阻止event dispatching thread
    • 如果您需要执行的操作甚至需要更长的时间,您应该从事件处理程序启动一个新线程,该线程将执行操作,并在完成时更新GUI。最直接的方法是使用SwingWorker。更好地阅读整章Concurrency in Swing以了解所有可能性。
    • 如果您需要在两个独立线程之间进行通信,例如,如果您需要一个线程等待某个标志更改,请使用Java's concurrency mechanisms之一而不是忙等待。 Guarded Blocks
    • 中讨论了如何替换繁忙等待的最直接方法

答案 2 :(得分:0)

你可以使用下面给出的代码片段,并将它们放入主题,它总是与主代码并行运行

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

}

或者可以通过点击特定控件来引发事件,该控件检查_val的值并执行操作