2013-03-07 237 views
-3

我问了一个关于我的实际问题的问题,但没有解决方案出现,所以我会尽量让它更加开放,我该如何让java等待某个输入?目前我有一个半无限while循环,它查看一个变量,直到ActionEvent在另一个类中触发时才会更新。不过,我已经读过关于线程和其他一些东西,是否好奇,是否有人可以详细阐述这个话题?基本上我正在一个GUI上工作,我的窗口弹出并要求输入密码,并且当按下按钮来改变变量以退出循环时。最奇怪的部分是它在学校电脑上运行,但不是我自己的。我甚至重新安装了我的JDK,但那不是。事实证明,这可能是一个速度问题,但通过打印声明,我发现变量得到更新,而我只是停止看它。如何让java等待

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; 
} 

这里有它的帮助代码。应该或多或少地按照执行的顺序进行,但并不是全部都是一个块,是多个类和所有类。我试图使用易失性,没有做任何事情。

+0

你不得不分享您的代码 – 2013-03-07 01:27:54

+0

的相关章节[如何使用对话框(http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html)? – MadProgrammer 2013-03-07 01:30:55

+0

使用自旋锁来处理模态对话框意味着最有可能有更好的方法来实现你想要的。尝试重构您的代码以更基于事件,特别是如果您使用默认的Swing UI类。 – 2013-03-07 01:37:48

回答

1

如果您正在更新和读取多个线程中的变量(可能是原始值),您是否声明变量为易失性关键字。为了优化你的线程可能已经缓存了这个值并且不读取这个改变的值--- volatile会迫使JVM每次读取这个变量而不进行缓存。

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

在更新的代码示例运行密码变量应该声明挥发性这样的:

private static volatile boolean running = true; 
+0

有关此文章:http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html – 2013-03-07 01:32:49

+0

我做到了这一点,但没有改变,我没有将它包含在代码报价中 – Syxx 2013-03-07 02:36:22