【问题标题】:How can I make java wait [closed]我怎样才能让java等待[关闭]
【发布时间】:2013-02-22 01:47:55
【问题描述】:

我问了一个关于我的实际问题的问题,但没有出现解决方案,所以我会尝试更加开放,我怎样才能让 java 等待某个输入?目前,我有一个半无限的 while 循环,它查看一个在另一个类中触发 ActionEvent 之前不会更新的变量。但是,我已经阅读了有关线程和其他一些内容的内容,很好奇是否有人可以详细说明这个主题?基本上我正在使用 GUI,我的窗口会弹出并要求输入密码,当按下按钮时会更改变量以退出循环。最奇怪的是它可以在学校计算机上运行,​​但不能在我自己的计算机上运行。我什至重新安装了我的 JDK,但事实并非如此。有人提出这可能是一个速度问题,但是通过打印语句,我看到变量得到了更新,我猜 while 只是停止查看它。

private static boolean running=true;

while(running){
}

...

public void actionPerformed(ActionEvent e){
    String temp = new String("");
    for(int x=0;x<passwordInput.getPassword().length;x++)
        temp+=passwordInput.getPassword()[x];
    PWCoder.passwordCheck(temp);
}

...

public static void passwordCheck(String pass){
if(pass.equals(password)){
    correctPW = true;
}
else if(pass.equals(overKey))
    PWCoder.override(password);
doneRunning();
}

...

public static void doneRunning(){
    running = false;
}

这里有它可以提供帮助的代码。应该或多或少按照它执行的顺序,但它不是一个块,而是多个类和所有。我尝试使用 volatile,但没有任何作用。

【问题讨论】:

  • 您必须共享代码的相关部分
  • 使用自旋锁来处理模式对话框意味着很可能有更好的方法来实现您正在尝试的内容。尝试重构您的代码,使其更加基于事件,尤其是在您使用默认的 Swing UI 类时。
  • @MadProgrammer 对话可能会做到这一点,我对它们进行了简短的试验,但代码在一台计算机上运行,​​而不是在另一台计算机上运行。这不是 IDE 或 JDK,但我也非常怀疑这是一个速度问题。

标签: java multithreading loops while-loop wait


【解决方案1】:

如果您在多个线程中更新和读取变量(可能是原始值),您是否使用 volatile 关键字声明了该变量。为了优化,您的线程可能已经缓存了值并且没有读取更改的值 --- volatile 强制 JVM 每次都读取变量而不缓存它。

除了声明变量 volatile 之外,如果不是原始字段并且需要多个原子操作来读取/写入值,您可以考虑使用 同步化 块来读取/写入变量。

在您更新的代码示例中,runningpassword 变量应声明为 volatile,如下所示:

private static volatile boolean running = true;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-10-30
  • 2016-05-07
  • 2015-05-08
  • 1970-01-01
  • 2019-12-26
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多