-3

実際の問題について質問しましたが、解決策が見つからなかったので、もっとオープンにしようと思います。Java に特定の入力を待機させるにはどうすればよいですか? 現在、別のクラスで ActionEvent が発生するまで更新されない変数を調べる半無限の while ループがあります。しかし、私はスレッドやその他のことについて読んでいましたが、誰かがこのトピックについて少し詳しく説明できるかどうか興味がありましたか? 基本的に、私は GUI で作業しています。ウィンドウがポップアップしてパスワードを要求し、ボタンを押すと、変数が変更されてループが終了します。最も奇妙な点は、学校のコンピューターでは機能するが、私のコンピューターでは機能しないことです。JDKを再インストールしましたが、それだけではありません。速度の問題である可能性があることがわかりましたが、print ステートメントを使用すると、変数が更新されていることがわかりますが、それを見るのをやめるだけだと思います。

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

それが役立つコードがあります。多かれ少なかれ実行される順序である必要がありますが、すべてが 1 つのブロックではなく、複数のクラスとすべてです。volatile を使用しようとしましたが、何もしませんでした。

4

1 に答える 1

1

複数のスレッドで変数 (おそらくプリミティブ値) を更新して読み取る場合、volatileキーワードを使用して変数を宣言しましたか。最適化のために、スレッドが値をキャッシュし、変更された値を読み取っていない可能性があります --- volatile は、キャッシュせずに毎回 JVM に変数を強制的に読み取らせます。

変数 volatile を宣言する以外に、プリミティブ フィールドではなく、値の読み取り/書き込みにアトミック操作以上の操作が必要な場合は、同期化されたブロックを使用して変数の読み取り/書き込みを行うことを検討できます。

更新されたコード例では、次のように実行変数とパスワード変数を揮発性として宣言する必要があります。

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