Kim*_*ble 1 java scheduledexecutorservice
这已经困扰了我几个小时。如果我安排一个任务在5秒钟内执行,然后立即取消该任务,我希望“ awaitTermination”方法立即返回,但是在整个7秒钟内它将一直阻塞(不是五个)
这是一个在Java 11上重现该问题的JUnit 5测试用例。
package dummy;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.fail;
class DummyTest {
@Test
@DisplayName("Cancelling task should work...")
void cancel_task() throws InterruptedException {
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
AtomicBoolean isExecuted = new AtomicBoolean(false);
ScheduledFuture<?> scheduled = executorService.schedule(() -> isExecuted.set(true), 5, TimeUnit.SECONDS);
scheduled.cancel(false);
if (!executorService.awaitTermination(7, TimeUnit.SECONDS)) {
fail("Didn't shut down within timeout"); // <-- Fails here
}
assertFalse(isExecuted.get(), "Task should be cancelled before executed");
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
您不会在executorService上调用shutdown或shutdownNow,因此可以永远等待。它永远不会终止。首先调用shutdown,然后单元测试应该工作。
scheduled.cancel(false);
executorService.shutdown(); // This was missing
if (!executorService.awaitTermination(7, TimeUnit.SECONDS)) {
...
Run Code Online (Sandbox Code Playgroud)
awaitTermination “阻塞,直到关闭请求后所有任务完成执行,或者发生超时,或者当前线程被中断,以先发生的为准”(从注释中复制,谢谢ptomli)。
| 归档时间: |
|
| 查看次数: |
31 次 |
| 最近记录: |