【问题标题】:Java get thread created by calling mainJava获取通过调用main创建的线程
【发布时间】:2010-09-15 08:52:13
【问题描述】:

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

Client.main();

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

【问题讨论】:

  • 在不知道您的 Client 做什么的情况下很难回答。

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


【解决方案1】:

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

Client.main() 是否执行任何任务其他而不是启动一个新线程?如果没有,您的测试可能会更简单地调用新线程最终将运行的任何run() 方法,并尽可能使测试单线程。

【讨论】:

  • 只是为了完成信息:是的,Client 正在扩展Thread。是的,main() 也可以做其他事情。无论如何,你一直很有帮助 (+1)。
【解决方案2】:

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

【讨论】:

  • 这里的问题是:你在一个线程实例上调用join(),而OP问题是获取这些实例。
【解决方案3】:

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

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

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

【讨论】:

  • 是的,我也想过。问题是,可以在 main() 中创建更多线程,因此很可能无法正常工作。还是谢谢。
  • 我以为你想等待所有这些线程完成??所以这只是你感兴趣的一个?给它起名字,得到上面提到的所有线程的集合,然后在那个集合中寻找那个(命名的)线程。加入它,你就完成了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
相关资源
最近更新 更多