2

コンストラクターの初期化時に変数を設定する実行可能な gui スイング クラスがあります。GUI が実行されると、独自の別のスレッドとして実行されます。ただし、問題は、GUI でアクションイベントがトリガーされたときです。初期化された変数にアクセスしようとすると、デフォルトにリセットされます。いくつかのデバッグの後、トリガーされたアクションイベントは独自のスレッドとして開始されるようです。アクション イベントを処理するときに、正しいスレッドで正しい変数にアクセスするにはどうすればよいですか?

コード例:

public class myGui implements Runnable{
    private flag = false;
    public myGui(){
        flag = true;
    }
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    System.out.println("The value of flag is: " + flag); // prints flag is false
    }
    public void run(){
        // Do stuff
    }
    // More code ...
}

私の例では、スレッドでコンストラクターを初期化するときに、フラグが true に設定されます。ただし、アクションイベントがトリガーされると、スレッド変数を無視してフラグが false に設定されていることがわかります。これを修正するにはどうすればよいですか?

ありがとう

4

1 に答える 1

7

ここで重要なのは、異なるスレッド間での変数の可視性です。同期がない場合、コンパイラ、プロセッサ、およびランタイムは、操作が実行されているように見える順序に対して、まったく奇妙なことを行う可能性があります。

したがって、変数にvolatile修飾子を使用して、flag変数への更新が他のスレッドに予測どおりに伝播されるようにします。

Swing での同時実行の初期スレッドのセクションを見てください。たとえば、invokeLaterまたはinvokeAndWaitを使用して、UI の更新がイベント ディスパッチャ スレッドで実行されるようにします。これにより、Swing に関連するさまざまなスレッドをより明確に理解できるはずです。

于 2013-01-09T20:28:59.807 に答える