如何让主线程等待ThreadPoolExecutor中其他线程完成

2024-01-26

我正在使用 ThreadPoolExecutor 在我的 Java 应用程序中实现线程。

我有一个 XML,我需要解析它并将其每个节点添加到线程中以执行完成。我的实现是这样的:

parse_ip 是创建的线程池对象,ParseQuotes XML 是具有 run 方法的类。

        try {     
           List children = root.getChildren();               
        Iterator iter = children.iterator();

        //Parsing the XML     
        while(iter.hasNext()) {       
           Element child = (Element) iter.next();           
           ParseQuotesXML quote = new ParseQuotesXML(child, this);         
           parse_tp.execute(quote);         
        }
    System.out.println("Print it after all the threads have completed");
        catch(Exception ex) {  
        ex.printStackTrace();      
        }
        finally {  
    System.out.println("Print it in the end.");
if(!parse_tp.isShutdown()) {
                if(parse_tp.getActiveCount() == 0 && parse_tp.getQueue().size() == 0 ) {
                    parse_tp.shutdown();                    
                } else {
                    try {
                        parse_tp.awaitTermination(30, TimeUnit.SECONDS);
                    } catch (InterruptedException ex) {
                        log.info("Exception while terminating the threadpool "+ex.getMessage());
                        ex.printStackTrace();
                    }
                }
            }
          parse_tp.shutdown();  
        }

问题是,这两个打印输出语句是在其他线程退出之前打印的。我想让主线程等待所有其他线程完成。 在正常的线程实现中,我可以使用 join() 函数来完成此操作,但无法在 ThreadPool Executor 中实现相同的效果。还想问一下finally块中写的代码是否正确关闭线程池?

谢谢, 阿米特


A CountDownLatch http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html正是为此目的而设计的。可以找到例子here https://stackoverflow.com/a/11372932/230513 and here http://groups.google.com/group/comp.lang.java.programmer/msg/1d9c821dcda040f6。当事先不知道线程数时,可以考虑Phaser https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Phaser.html,Java 1.7 中的新功能,或者UpDownLatch http://groups.google.com/group/comp.lang.java.programmer/browse_frm/thread/2342bd25ac3dd6b9.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让主线程等待ThreadPoolExecutor中其他线程完成 的相关文章

随机推荐

  • 如何在 C# 中禁用 CodeLens 的引用显示 [重复]

    这个问题在这里已经有答案了 我正在跟进某个线程 https stackoverflow com a 17848184 1525840提出某种方法 如下图所示 无法禁用该功能显示参考文献对于所有语言 当我发现这一点时 我尝试单独对 C 执行此
  • Web浏览器控件的window.external始终为null

    Web 浏览器的 Window External 对象始终为 null 要重现 请将 Web 浏览器放在新的 winform 上并输入 Option Strict Off Public Class Form1 Private Sub For
  • 省略 C++ 模板中的参数

    调用模板函数时可以省略函数名后面的类型吗 作为示例 请考虑以下函数 template
  • System.Move 和字符串数组

    我正在尝试将一些数组元素 字符串 移动到其他位置 当我使用System Move FastMM4 报告泄漏 这是一个显示问题的小片段 procedure TForm1 Button2Click Sender TObject type TAr
  • control.Show 和 BringToFront 之间有什么区别?

    显示 隐藏和 BringToFront SendToBack 有什么区别 在什么情况下我们应该使用一对而不是另一对 Show 相当于设置Visible true 它不会改变控件的 Z 顺序 如果控件被 Z 顺序前面的某个其他控件关闭 用户仍
  • Android BatteryManager 对所有属性检索调用返回 0

    我在尝试访问 Android 设备电池的大部分统计数据时遇到问题 例如BATTERY PROPERTY CAPACITY BATTERY PROPERTY CHARGE COUNTER or BATTERY PROPERTY CURRENT
  • 通过 user_id 获取 Google App Engine 用户

    In GAE http code google com appengine 你能查一下User http code google com appengine docs python users userclass html与 User 对象
  • 多台物理机上的 Vagrant VM

    我看到 Vagrant 有一个 AWS 插件 支持使用 Vagrant 来配置和运行多个 ec2 实例 AWS 之外是否存在此功能 使用示例 目前我在一台机器上有 5 个虚拟机 通过 VagrantFile 可以直接设置和管理 我现在可以访
  • 如何检查 Smarty 变量是否已分配?

    如何检查特定值是否已分配给 Smarty 以及是否未分配 默认 值 Answer if this gt cismarty gt get template vars test null this gt cismarty gt assign t
  • Quarkus 日志追踪,相当于 Spring Cloud Sleuth

    日志跟踪是非常重要的事情 所以我稍微研究了一下这段代码 将请求 ID 与响应 ID 进行匹配 连接 这适用于跟踪来自 来自我的 ws rs 资源的请求响应 Provider public class LoggingFilter implem
  • 为什么内部 Lua 字符串以它们的方式存储?

    我想要一个简单的字符串表来存储一堆常量 我想 嘿 Lua 可以做到这一点 让我使用其中的一些函数 这主要在lstring h lstring c文件中 我使用的是5 2 我先展示我好奇的代码 它来自 lobject h Header for
  • 如何将图像从本机反应发送到本机模块?

    Problem 我正在尝试将一组图像 保存在本地资源文件夹的 javascript 端 发送到本机端 iOS 和 Android 本机端处理图像并返回新图像 这是有效的 因为我尝试发送图像 URL 使用基于互联网的图像而不是本地图像 并且本
  • 除了snow SOCK之外的集群并行计算

    最近 R2 14 中添加的对并行计算的直接支持在我脑海中引发了一个问题 在 R 中创建集群有很多选项 我使用snow定期进行SOCK集群 但我知道还有其他方式 例如MPI 我用的是SOCKsnow集群 因为我不需要安装任何额外的软件 我使用
  • Facebook FQL 流限制?

    我想了解我的墙的完整历史 但我似乎在六月的某个时候就达到了极限 我进行了多次这样的调用 SELECT created time message FROM stream WHERE source id MY USER ID LIMIT 50
  • AWK 使用标题拆分大型 CSV 文件并根据列值打印输出文件

    我有一个大约 800 mb 的 CSV 文件 需要使用 AWK 对其进行拆分 该文件有一列 其中包含 ID 我想用它来分割文件 我熟悉 知道如何使用 Perl 完成此任务 但不熟悉 AWK 因为我只使用过几次 在 perl 中 我将使用 T
  • IIS 仅要求特定文件夹的登录凭据

    我在 IIS 7 上有一个网站 其中有几个子文件夹 该站点是使用 net 2 构建的 并以集成模式在池中运行 除了名为 Reports 的文件夹下的所有 aspx 文件外 整个网站运行良好 当用户尝试访问该文件夹下的任何 aspx 页面时
  • 启动期间自动挂载单独分区时 systemd/udev 依赖失败

    编辑 当我尝试使用带有任何安装点的单独分区时 而不仅仅是使用单独的分区时 就会发生这种情况 var 我正在使用 Buildroot 构建嵌入式 Linux 系统 我尝试为 var 使用单独的分区 但任何安装点都会发生这种情况 我的init系
  • 当我 Assembly.Load 肯定存在的程序集时,为什么会出现 FileNotFoundException?

    在我的 Windows Azure 角色 C 代码中 我执行以下操作 Assembly Load Microsoft WindowsAzure ServiceRuntime and FileNotFoundException被抛出 问题是存
  • Matplotlib 样式表未应用

    我一直在尝试几种样式表 但似乎没有一个适用于画布 这是我第一次使用twinx 所以也许这就是问题所在 我尝试过的代码如下 import pickle import numpy as np import matplotlib pyplot a
  • 如何让主线程等待ThreadPoolExecutor中其他线程完成

    我正在使用 ThreadPoolExecutor 在我的 Java 应用程序中实现线程 我有一个 XML 我需要解析它并将其每个节点添加到线程中以执行完成 我的实现是这样的 parse ip 是创建的线程池对象 ParseQuotes XM