Java获取通过调用main创建的线程

Java获取通过调用main创建的线程,java,multithreading,unit-testing,junit,client-server,Java,Multithreading,Unit Testing,Junit,Client Server,我有一个客户机-服务器应用程序,出于测试目的,我需要通过调用 Client.main(); 这就产生了一些新的线索。现在,在测试中执行断言之前,我需要等待线程完成。我怎么知道这是什么时候发生的?或者,我如何知道哪个线程是由调用启动的,客户端也可以创建其他线程。以编程方式调用main不会自行启动新线程。只有当main方法具有显式启动新线程的代码时,才会发生这种情况。如果是这种情况,您应该更改客户机以某种形式提供对此线程的访问,以便可以对其调用join。调用Thread.join是等待线程完成的标

我有一个客户机-服务器应用程序,出于测试目的,我需要通过调用

Client.main();
这就产生了一些新的线索。现在,在测试中执行断言之前,我需要等待线程完成。我怎么知道这是什么时候发生的?或者,我如何知道哪个线程是由调用启动的,客户端也可以创建其他线程。

以编程方式调用main不会自行启动新线程。只有当main方法具有显式启动新线程的代码时,才会发生这种情况。如果是这种情况,您应该更改客户机以某种形式提供对此线程的访问,以便可以对其调用join。调用Thread.join是等待线程完成的标准方法

除了启动新线程外,Client.main是否执行其他任务?如果不是这样,您的测试可能更简单,只需调用新线程最终运行的任何run方法,并尽可能使测试成为单线程。

以编程方式调用main不会单独启动新线程。只有当main方法具有显式启动新线程的代码时,才会发生这种情况。如果是这种情况,您应该更改客户机以某种形式提供对此线程的访问,以便可以对其调用join。调用Thread.join是等待线程完成的标准方法

除了启动新线程外,Client.main是否执行其他任务?如果没有,那么您的测试只调用新线程最终运行的任何run方法可能会更简单,并尽可能使测试成为单线程。

您可以使用join等待其他线程完成执行。

您可以使用join等待其他线程完成执行。

从未尝试过,但它可以在您的特殊情况下工作。线程有一个静态方法来获取所有活动线程的stacktrace,使用此方法可以获得一组线程对象。在调用main之前和之后调用它应该允许您获取对在执行main方法时已创建/启动的所有线程的引用:

 Set<Thread> before = Thread.getAllStackTraces().keySet();
 Client.main();
 Set<Thread> after = Thread.getAllStackTraces().keySet();
当然,如果线程是用唯一的ID/名称创建的,那么识别线程就更容易、更可靠了。现在,您可以计算差异并在所有这些线程上调用join。它可能有很多副作用,但如上所述,在您的特定测试用例中可能会有所帮助。

从未尝试过它,但它可以在您的特殊情况下工作。线程有一个静态方法来获取所有活动线程的stacktrace,使用此方法可以获得一组线程对象。在调用main之前和之后调用它应该允许您获取对在执行main方法时已创建/启动的所有线程的引用:

 Set<Thread> before = Thread.getAllStackTraces().keySet();
 Client.main();
 Set<Thread> after = Thread.getAllStackTraces().keySet();

当然,如果线程是用唯一的ID/名称创建的,那么识别线程就更容易、更可靠了。现在,您可以计算差异并在所有这些线程上调用join。它可能有很多副作用,但是如上所述,可能对您的特定测试用例有所帮助。

在不知道客户端做什么的情况下很难回答。在不知道客户端做什么的情况下很难回答。这里的问题是:在线程实例上调用join,OP问题是获取这些实例。这里的问题是:在线程实例上调用join,OP问题是获取这些实例是的,我也想到了。问题是,可以在主线程中创建更多线程,因此它很可能无法工作。无论如何,谢谢。我以为你想等所有的线程完成??所以这只是你感兴趣的一个?为它命名,获取上面提到的所有线程的集合,并在该集合中查找该命名线程。加入它,你就完成了。是的,我也想到了。问题是,可以在主线程中创建更多线程,因此它很可能无法工作。无论如何,谢谢。我以为你想等所有的线程完成??所以这只是你感兴趣的一个?为它命名,获取上面提到的所有线程的集合,并在该集合中查找该命名线程。加入它,您就完成了。只需完成以下信息:是的,客户端正在扩展线程。是的,主播也做其他事情。不管怎样,您已经帮了我+1。只需完成以下信息:是的,客户端正在扩展线程。是的,主播也做其他事情。不管怎样,你帮了我+1。