0

start変数がtrue次のようになるまで処理を開始しないバックグラウンド スレッドがあります。

class MyBackgroundThread implements Runnable {
    // ...

    public void run() {
        while(true) {
            if(!start) continue;

            doSomethingWith(myValue);
        }
    }
}

もちろんイベントディスパッチスレッドで実行されてstartいるボタンをクリックすると、変数はtrueに設定されます。ボタンをクリックして設定されるバックグラウンド スレッド クラスにJFrameもフィールドがあります。myValue

startBtn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        backgroundThreadInstance.setMyValue(100);
        backgroundThreadInstance.setStart(true);

        // ...
    }
});

ご覧のとおり、myValueに設定startする前に に何かを割り当てていtrueます。myValuestartas の設定volatileは不要ということですか?が最初に書き込まれるため、 ismyValueの前にバックグラウンド スレッドにリークされるため、バックグラウンド スレッドは初期化されていない?startを処理する機会がありません。myValue

4

1 に答える 1

1

簡単な答えはイエスです。実際には、最終的には true への変更がスレッドに表示される可能性がありますが、理論的には決して発生しない可能性があります。

ただし、ビジー/アイドルループよりもこれを行うためのより良い方法があるという@NamshubWriterに同意してください。整数を設定して ExecutorService に送信するという彼の提案が気に入っています。例えば

public void actionPerformed(ActionEvent e) {
  BackgroundRunnableInstance runnable = new BackgroundRunnableInstance();
  runnable.setMyValue(100);  // could be in the constructor instead
  someExecutorService.submit(runnable);
}

1 つの違いは、ボタンを複数回押すと、複数のランナブルが開始されることです。あなたが望むものかもしれないし、そうでないかもしれません。

于 2013-02-05T21:32:25.897 に答える