5

実行を続行する前にEDTがGUIを更新するのを待つ必要があるワーカースレッドがあります。私はpublishメソッドを使用して、EDTに何かを変更するように指示しました。どうすればその変更が行われるのをワーカーに待たせることができますか?

4

2 に答える 2

5

結果を公開するためにSwingWorkerを使用していると想定しています。ブールフラグを使用して、値が処理されたことを示すことができます。このフラグは、中間結果を公開する前にクリアされ、設定されるまでスレッドをブロックするために使用されます。UIスレッドは、公開されたデータの処理が完了するとフラグを設定します。

class MyWorker extends SwingWorker<K,V>
{
    boolean processed = true;

    protected void doInBackground() {
        for (;;) {
            setProcessed(false);
            publish(results);
            waitProcessed(true);
        }
    }

    synchronized void waitProcessed(boolean b) {
        while (processed!=b) {
           wait();
        }
        // catch interrupted exception etc.
    }

    synchronized void setProcessed(boolean b) {
        processed = b;
        notifyAll();
    }


    protected void process(List<V> results) {
       doStuff();
       setProcessed(true);
    }
}
于 2010-07-03T22:29:22.413 に答える
4

GUIの変更を開始しているのが同じワーカースレッドでもある場合は、それらの変更が行われるのを待つための既成のメカニズムがあります。

SwingUtilities.invokeAndWait()

法案にうまく合うはずです。

もう1つの方法は、SwingUtilities.invokeLater()を使用して、EDTに実行するコードを与えることです。これにより、EDTがアイドル状態になると、つまり、このタスクの実行に取り掛かったときにスレッドがウェイクアップします。これには、invokeLater()直後にwait()起動し、EDIからのウェイクアップが実行される前に発生しないことを期待することが含まれますwait()。ただし、これはタイミングに関しては完全に確実ではありません。

于 2010-07-03T22:22:44.097 に答える