如何发出多个 SwingWorker 都已完成的信号?

How to signal that multiple SwingWorkers are all done?

我有以下问题,或者想做,我有 n 个 运行ning SwingWorker,数量可以在 1 到 10 之间变化。我从一个主线程启动它们,并在 n 个中创建它们数,然后让它们 运行。在完成所有 n 个 SwingWorkers 之后,我想做另一个任务,它基本上使用信息,SwingWorkers 处理并将它们全部加入主线程以对其进行处理。但是要开始此任务,所有 n 个 SwingWorker 都需要 finished/done 并且所有 n 个 SwingWorker 都需要成功完成。

最好的方法是什么? Java 中是否已经有一种机制可以执行类似的操作,例如 ThreadManager,您可以将多个 SwingWorker 放入其中,然后它会向主线程触发 doneAll() 或类似的东西?

主线程同时在做其他事情,不能等n个SwingWorker完成。我需要一个“全部完成”的火灾事件。

我想在主线程中创建另一个线程,运行它是一个 while 循环(untillAllSWFfinished),在循环中等待 500 毫秒进行检查,但这对我来说似乎有点脏。

有没有更优雅的方法来实现这个?

如果您知道要启动多少工人,则可以使用 CountdownLatch。如果你不知道有多少作品正在启动,你可以使用Phaser。

示例:

//using a button as a basic UI component to do work.
JButton button = new JButton(new AbstractAction() {
        
    @Override
    public void actionPerformed(ActionEvent e) {
        Runnable control = new Runnable() {
            @Override
            public void run() {
                //assuming we know we're going to do 20 bits of isolated work.
                final CountDownLatch latch = new CountDownLatch(20);
                for (int i = 0; i < 20; i++) {
                    SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
                        @Override
                        public Void doInBackground() {
                            //do your work
                            return null;
                        }
                            
                        @Override
                        public void done() {
                            latch.countDown();
                        }
                    };
                    worker.run()
                }
                try {
                   latch.await();
                } catch (Exception e) {
                   e.printStackTrace();
                }
                //so your next bit of work.
            }
        };
        SwingUtilities.invokeLater(control);
    }
});