我试图写一个集成测试,导致一个InterruptedException
从生产代码提出:之前调用的Future.get()中断线程
@Test
public void test() {
productionObject = new ProductionObject(
com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor());
Thread.currentThread().interrupt();
assertThat(productionObject.execute(), equalTo(defaultResponse));
}
内productionObject
的实现:
try {
for (Future<T> future : executorService.invokeAll(tasks))) {
results.add(future.get());
}
return results;
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // preserve interrupt flag
return defaultResponse;
}
里面AbstractQueuedSynchronizer.acquireSharedInterruptibly()
我看到:
if (Thread.interrupted())
throw new InterruptedException();
所以我期望这个测试通过一致。
我在构建服务器中看到过这个失败(返回的是results
而不是defaultResponse
)。我一直无法在本地重现失败,在一段时间(true)循环中运行测试,并通过软件渲染运行glxgears来模拟较高的负载;-)任何人都可以发现我的错误,给我一些关于去哪里寻找的建议,或建议可以帮助我的工具?
构建服务器是否使用不同的JVM?也许它的executorService工作方式不同。 – Kenster 2013-02-21 16:13:13
@hertzsprung是否有任何情况下'results.isEmpty()'在构建服务器中返回true? – 2013-02-21 16:40:05
我试图重现问题,但没有成功。您是否提供了ProductionObject的所有相关代码?我在问,因为也许代码中的某处中断标志正在重置。这可能是通过对Thread.interrupted()的无辜调用,或者通过处理InterruptedException而不再次设置标志来实现的。您是否尝试过调试以找到标志变为假的地方? – 2013-02-21 21:18:37