複数の SwingWorkers を待機しています
この質問では、それぞれがラベルの更新を担当する複数の SwingWorkers を作成し、次の場合にすべてのラベルを削除する方法を尋ねます。すべてのワーカーが終了しました。
1 つの解決策は、スレッドが待機できるようにする CountDownLatch を使用することです。実行を再開する前に、指定された数の他のスレッドがタスクを完了するようにします。提供されたコードでは、各ワーカーは完了時に latch.countDown() を呼び出しますが、スーパーバイザー ワーカーはすべてのタスクが終了するまで latch.await() をブロックします。その後、スーパーバイザーはラベルを更新するか、ラベルを完全に削除します (ただし、後者のオプションは一般に魅力的ではありません)。
このアプローチを示す拡張コード例を次に示します。
import java.awt.Color; import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.*; /** * @see https://stackoverflow.com/a/11372932/230513 * @see https://stackoverflow.com/a/3588523/230513 */ public class WorkerLatchTest extends JApplet { private static final int N = 8; private static final Random rand = new Random(); private Queue<JLabel> labels = new LinkedList<JLabel>(); private JPanel panel = new JPanel(new GridLayout(0, 1)); private JButton startButton = new JButton(new StartAction("Do work")); public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame();
以上が複数の SwingWorkers を管理し、ラベルを効率的に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。