【问题标题】:Java wait for all threads before terminatingJava 在终止之前等待所有线程
【发布时间】:2014-02-26 11:14:51
【问题描述】:

我正在尝试使用 Jmeter 测试应用程序。该应用程序使用创建多个线程的专有库。在 JMeter 中,我创建了一个 AbstractJavaSamplerClient,它似乎不会等待应用程序中可能生成的所有其他线程。相反,它只是运行自己的默认方法并关闭,让其他线程在后台运行 - 因为我正在连接到应用程序中的服务器,所以我可以通过服务器日志看到它仍然连接。由于我没有对其他线程的引用,因为它们是通过专有库实例化的,所以我不能使用 wait() 或 join() 的常见解决方案。如何让主线程等待所有线程(我也没有参考)?

【问题讨论】:

    标签: java multithreading jmeter load-testing


    【解决方案1】:

    将所有与库相关的工作放在专门创建的线程组中的单独线程中。该库将在该线程组及其后代中创建新线程。使用group.enumerate(new Thread[group.activeCount()*2],true) 递归列出该组的所有线程。然后你就可以 join() 他们了。

    【讨论】:

    • activeCount()*2 的“技巧”很好,但要正确,必须检查 enumerate 的返回值是否严格小于给定长度(严格是因为如果它的大小完全相同,你无法区分尺寸过小的情况和恰好适合的情况)。是的,使用起来有点尴尬。
    【解决方案2】:

    你可以开始

    Thread.getAllStackTraces().keySet();
    

    这将为您提供一组所有正在运行的线程。这将包括您对所有其他线程感兴趣的线程,包括 JVM 内部的线程。

    希望您能够按名称过滤掉您感兴趣的人,然后您可以join()他们。

    【讨论】:

    • 感谢您的解决方案。但是,我继续使用 Alexei 的解决方案。
    • 是的,这是一个更清洁的解决方案。
    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 2015-06-15
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多