Aeq*_*tas 10 java junit multithreading executorservice countdownlatch
我正在尝试测试一个在单独的线程中工作的方法,简化它是这样的:
public void methodToTest()
{
Thread thread = new Thread()
{
@Override
public void run() {
Clazz.i = 2;
}
};
thread.start();
}
Run Code Online (Sandbox Code Playgroud)
在我的单元测试中,我想测试Clazz.i == 2,但我不能这样做,因为我认为断言是在线程更改值之前运行的.我想使用另一个线程来测试它,然后使用join等待,但它仍然无法正常工作.
SSCCE:
@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;
}
Run Code Online (Sandbox Code Playgroud)
我认为这是因为测试主代码创建了一个等待(加入)第二个线程的线程,但是第二个线程没有完成工作,它创建另一个线程来完成工作然后完成,这继续第一个线程,而第三个线程Clazz.i = 2在断言后执行.
我怎样才能使第一个线程等待它启动的线程以及该线程启动的任何线程?
如果没有对创建的线程的引用methodToTest,则不能简单.Java没有提供查找"在这个特定时间段内生成的线程"的机制(即使它确实如此,它也可能是一个丑陋的机制).
在我看来,你有两个选择:
methodToTest等待它产生的线程.当然,如果您明确希望这是一个异步操作,那么您不能很好地做到这一点.methodToTest,以便任何呼叫者可以选择等待它,如果他们愿意的话.可以注意到,第二选择可以以几种不同的方式表达.例如,Future如果你想扩展methodToTest使用各种方式进行异步工作的自由,你可以返回一些类似抽象的对象而不是一个线程.您也可以定义一些全局任务池,强制执行所有异步任务以在其中运行,然后在检查断言之前等待池中的所有任务完成.这样的任务池可以采用一种ExecutorService或ThreadGroup多种形式,或任何数量的其他形式.它们最终都做同样的事情,但可能或多或少地适合你的环境 - 主要的一点是你必须明确地给调用者访问新创建的线程,这是某种方式.
| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |