java - 检测多个线程何时完成的正确方法 - Java

标签 java multithreading

我编写了以下方法来并行运行多个线程,当所有线程完成时,我想触发一些进一步的操作。我已将 propertyChangeListener 附加到在其自己的线程中运行的每个对象,并且每个对象在其线程完成时都会触发属性更改事件。因此,对于每个事件,我都会增加计数并将其与对象列表的大小进行比较。一旦它们相等,我就知道所有线程都已完成。然而,这似乎有点困惑,而且我对多线程还很陌生,所以我想我应该问问其他人对我的方法的看法,以及是否有更优雅或更强大的方法。谢谢。

private void jButtonRunSubsetsActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        count = 0;
        List<SpeciesSelection> specSelList = new ArrayList<>();

        for (String str : fileList) {
            // TODO RUN THE FILES
            if (!str.equals("")) {
                String[] args = {str};
                //run solution
                SpeciesSelection specSel = new SpeciesSelection(args, true);
                specSelList.add(specSel);// add the thread to the list so we can check for all threads to be finished.

                // Create listener to listen for specSel finished
                specSel.addPropertyChangeListener(new PropertyChangeListener() {
                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        // TODO do something
                        count++;
                        if (count == specSelList.size())
                        {
                            System.out.println("Finished all threads");
                        }
                    }
                });

                Thread t = new Thread(specSel);
                t.start();
            }
        }
    }

最佳答案

不要使用 int 计数器并检查其值,而是使用设计的 CountDownLatch

CountDownLatch count = new CountDownLatch(nbRequiredCount);
count.await(); 

当计数器未达到 0 时,await() 不会返回。

并在线程中递减它:

public void propertyChange(PropertyChangeEvent evt) {
    // TODO do something
    count.countDown();
}

关于java - 检测多个线程何时完成的正确方法 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49029026/

相关文章:

java - 添加 url 样式路径映射到服务器/客户端套接字连接

java - Eclipse/Java路径问题

java - 如何使用EventBus?

编译器对临时变量的 Java 优化

multithreading - 如何在多线程时安全地访问和修改数组?

c# - 计时器 C#。开始、停止和获取调用之间的时间量

java - 具有多个 Java 线程时使用 Apache Spark 的可行性

java - 进行预定的调用以再运行一次

java - 如何在java中向JPanel添加Applet

c# - FileStream 锁定文件以进行读写