Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 取消ScheduledExecutorService中计划的任务会使executor保持活动状态_Java_Scheduledexecutorservice - Fatal编程技术网

Java 取消ScheduledExecutorService中计划的任务会使executor保持活动状态

Java 取消ScheduledExecutorService中计划的任务会使executor保持活动状态,java,scheduledexecutorservice,Java,Scheduledexecutorservice,这件事已经困扰了我几个小时了。。如果我计划在5秒钟内执行一个任务,然后立即取消该任务,我希望WaitTermination方法立即返回,但它会在整整7秒钟内保持阻塞,而不是5秒钟 下面是一个JUnit5测试用例,它再现了Java11上的问题 package dummy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.concurrent.Executo

这件事已经困扰了我几个小时了。。如果我计划在5秒钟内执行一个任务,然后立即取消该任务,我希望WaitTermination方法立即返回,但它会在整整7秒钟内保持阻塞,而不是5秒钟

下面是一个JUnit5测试用例,它再现了Java11上的问题

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");
  }

}

有什么想法吗?

在Executor服务中,您不会调用shutdown或shutdownNow,因此您可以永远等待。它永远不会结束。首先调用shutdown,然后单元测试应该可以工作

scheduled.cancel(false);
executorService.shutdown(); // This was missing
if (!executorService.awaitTermination(7, TimeUnit.SECONDS)) {
...

阻塞,直到关闭请求后所有任务都已完成执行,或超时发生,或当前线程中断,无论发生哪种情况,请先从注释中复制,谢谢ptomli。

您的executorService上没有调用shutdown或shutdownNow,因此您可以永远等待。它永远不会结束。首先调用shutdown,然后单元测试应该可以工作

scheduled.cancel(false);
executorService.shutdown(); // This was missing
if (!executorService.awaitTermination(7, TimeUnit.SECONDS)) {
...

阻塞,直到关闭请求后所有任务都已完成执行,或超时发生,或当前线程中断(以最先从注释中复制的为准),感谢ptomli。

从:阻塞,直到关闭请求后所有任务都已完成执行,或超时发生,或当前线程中断,以先发生的为准。从:阻塞,直到关闭请求后所有任务都已完成执行,或超时发生,或当前线程中断,以先发生的为准。添加指向参考文档的链接可能会很有用,其中说>阻塞,直到关闭请求后所有任务都已完成执行,或者超时发生,或者当前线程中断,以先发生的为准。啊,该死的,当我试图孤立地再现我的问题时,我忘记了这一点。当我先呼叫关机时,它显然起作用。那么我想问题出在别处了。谢谢:-看起来我正在努力解决这个问题,添加一个指向参考文档的链接可能会很有用,其中说>阻塞直到所有任务在关闭请求后完成执行,或者超时发生,或者当前线程中断,以先发生的为准。啊,该死的,当我试图孤立地再现我的问题时,我忘记了这一点。当我先呼叫关机时,它显然起作用。那么我想问题出在别处了。谢谢:-看起来我正在努力解决这个问题