我正在尝试测试一种在单独的线程中工作的方法,简化后如下所示:
public void methodToTest()
{
Thread thread = new Thread()
{
@Override
public void run() {
Clazz.i = 2;
}
};
thread.start();
}
在我的单元测试中,我想测试 Clazz.i == 2,但我不能这样做,因为我认为断言在线程更改值之前运行。想过换个线程测试一下,然后用join等待,还是不行。
中南合作:
@Test
public void sscce() throws InterruptedException
{
Thread thread = new Thread()
{
@Override
public void run() {
methodToTest()
}
};
thread.start();
thread.join();
AssertEquals(2, Clazz.i);
}
public static class Clazz
{
public static int i = 0;
}
我认为这是因为测试主代码创建了一个正在等待(加入)到第二个线程的线程,但是第二个线程没有做工作,它创建了另一个线程来做工作然后完成,这继续第一个线程,而第三个线程在断言之后执行 Clazz.i = 2
。
我怎样才能让第一个线程等待它启动的线程以及该线程启动的任何线程?
最佳答案
如果没有对在 methodToTest
中创建的线程的引用,您就不能,非常简单。 Java 没有提供用于查找“在此特定时间段内生成的线程”的机制(即使提供了,也可以说是一种丑陋的使用机制)。
在我看来,您有两个选择:
- 让
methodToTest
等待它产生的线程。当然,如果您明确希望这是一个异步操作,那么您就不能很好地做到这一点。 - 从
methodToTest
返回新创建的线程,这样任何调用者都可以根据需要选择等待它。
可能会注意到,第二个选择可以用几种不同的方式来表述。例如,您可以返回一些摘要 Future
-like object 而不是线程,如果您想扩展 methodToTest
的自由以使用各种方式进行异步工作。您也许还可以定义一些全局任务池,强制所有异步任务在其中运行,然后在检查断言之前等待池中的所有任务完成。这样的任务池可以采用 ExecutorService
的形式。 , 或 ThreadGroup
,或任何数量的其他形式。它们最终都做同样的事情,但可能或多或少适合您的环境——要点是您必须明确让调用者访问新创建的线程,是一些方式或其他方式。
关于java - 如何等待产生自己线程的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35075886/