-3

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

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,但没有做任何事情。

4

1 回答 1

1

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

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

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

private static volatile boolean running = true;
于 2013-03-07T01:32:00.603 回答