gpt4 book ai didi

java - 在调用 Future.get() 之前中断线程

转载 作者:行者123 更新时间:2023-11-30 11:35:36 25 4
gpt4 key购买 nike

我正在尝试编写一个集成测试,它会导致从生产代码中引发 InterruptedException:

@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)。我一直无法在本地重现故障,在 while (true) 循环中运行测试,并通过运行带有软件渲染的 glxgears 来模拟更高的负载;-) 任何人都可以发现我的错误,给我一些关于在哪里看的建议,或建议可以帮助我的工具?

最佳答案

奇怪。我和你一样读代码。我明白了:

  1. FutureTask.get() 调用 Sync.get()。我假设我们在这里处理 FutureTask
  2. Sync.get() 调用 Sync.innerGet()
  3. Sync.innerGet() 调用 acquireSharedInterruptibly(0);
  4. 代码如下:

    if (Thread.interrupted())
    throw new InterruptedException();

我认为这总是会抛出。也许存在某种竞争条件,所以线程还不知道它已被中断?您是否尝试过在中断线程后 hibernate 100 毫秒?

我刚刚在我的多 cpu Mac 上运行了以下测试,它从未失败,所以它看起来不像是竞争条件——至少对于我的架构和 JRE 版本 1.6.0_41。

for (long i = 0; i < 10000000; i++) {
Thread.currentThread().interrupt();
assertTrue(Thread.interrupted());
}

关于java - 在调用 Future.get() 之前中断线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15006882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com