Java通过调用main来创建线程

时间:2010-09-15 08:52:14

标签: java multithreading unit-testing junit client-server

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

在测试方法中启动客户端
Client.main();

这会创建一些新线程。现在我需要等到该线程完成后再在我的测试中执行断言。我怎么知道这发生的时间?或者,我怎么知道,调用启动了哪个线程(客户端也可以创建其他线程)。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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