我有一个客户端服务器应用程序,出于测试目的,我需要通过调用
在测试方法中启动客户端Client.main();
这会创建一些新线程。现在我需要等到该线程完成后再在我的测试中执行断言。我怎么知道这发生的时间?或者,我怎么知道,调用启动了哪个线程(客户端也可以创建其他线程)。
答案 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。 可能有一些副作用,但如上所述,可能对您的特定测试案例有所帮助。