当前位置: 首页 > 知识库问答 >
问题:

如何使定时执行者服务在取消其调度任务时自动终止

童铭晨
2023-03-14

如果网络连接已打开超过几个小时,我将使用ScheduledExecutorService关闭网络连接。然而,在大多数情况下,网络连接在达到超时之前就关闭了,因此我取消了调度未来。在这种情况下,我还希望executor服务终止并释放其线程池。

令我惊讶的是,这并不是开箱即用的:虽然我在调度任务后对executor服务调用了<code>shutdown(),但当其唯一调度的任务被取消时,executor不会自动终止。从ExecutorService的JavaDoc。shutdown()这种行为甚至可能是正确的,因为可以说取消的任务尚未“执行”:

void java.util.concurrent.ExecutorService.shutdown()

启动有序关机,执行以前提交的任务,但不接受新任务。如果调用已经关闭,则不会产生额外的效果。

我的问题是这是否可以改变:有没有可能配置一个executor服务,当它唯一的调度任务被取消时自动终止?

或者与JUnit测试相同的问题:

@Test
public void testExecutorServiceTerminatesWhenScheduledTaskIsCanceled() throws Exception {
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    Runnable task = new Runnable() {
        @Override
        public void run() {
            // ...
        }
    };

    ScheduledFuture<?> scheduledTask = scheduler.schedule(task, 2000, TimeUnit.MILLISECONDS);
    scheduler.shutdown();
    // do more configuration here...

    Thread.sleep(1000);

    scheduledTask.cancel(false);

    Thread.sleep(100);
    assertThat(scheduler.isTerminated(), is(true)); // ... so that this passes!?
}

共有1个答案

暨高洁
2023-03-14

schduledThreadPoolExec在(由Executors.newScheduledThreadPool返回的实际类型)留档:

如果提交的任务在运行前被取消,执行将被抑制。默认情况下,此类已取消的任务不会自动从工作队列中删除,直到其延迟结束。虽然这可以实现进一步的检查和监控,但也可能导致取消任务的无限保留。要避免这种情况,请将setRemoveOnCancelPolicy(boolean)设置为true,这将导致任务在取消时立即从工作队列中删除。

不过,这是一个 ScheduledThreadPoolExecutor 方法。我不认为纯粹使用SchpectedExecutorService接口可以解决这个问题。

 类似资料:
  • 原文链接:Serverless 应用开发指南:CRON 定时执行 Lambda 任务 在上一篇文章《Serverless 应用开发指南:基于 Serverless 的 GitHub Webhook》里,我们介绍了如何用 Webhook 来触发定时的 Lambda 函数。这种方式与我们平时的 CI(持续集成)服务器相似,而CI(持续集成)服务器除了会监听 PUSH 事件。还会执行一些定时的任务,比如

  • 每隔一段时间需要调度任务执行,也许你想注册一个任务在客户端完成连接5分钟后执行,一个常见的用例是发送一个消息“你还活着?”到远端通,如果远端没有反应,则可以关闭通道(连接)和释放资源。 本节介绍使用强大的 EventLoop 实现任务调度,还会简单介绍 Java API的任务调度,以方便和 Netty 比较加深理解。 使用普通的 Java API 调度任务 在 Java 中使用 JDK 提供的 S

  • 问题内容: 我正在为我的学校创建一个应用程序,该应用程序应每n分钟检查一次网站上是否有新标记。为此,当用户首次登录时,实际标记的编号将保存在“ UserDefaults”中。当应用终止时,n分钟后,将重新计算标记的数量,并将其与前一个标记进行比较,并在更改数量时发送通知。 我想知道是否有一种方法可以执行此任务。我尝试在-applicationWillTerminate-中创建一个计时器,但只触发了

  • 在上下文中没有Executor bean的情况下,Spring Boot会自动配置一个具有合理默认值的ThreadPoolTaskExecutor,这些默认值可以自动与异步任务执行(@EnableAsync)和Spring MVC异步请求处理相关联。 如果您在上下文中定义了自定义Executor,则常规任务执行(即@EnableAsync)将透明地使用它,但不会配置Spring MVC支持,因为它

  • 问题内容: 我想将我的python软件包设为“ pip installable”。问题在于,程序包具有必须来自用户的初始Shell脚本(例如)的Shell脚本。 但是在安装之后,用户并不完全知道脚本的去向(大概是,但是我们不能保证)。当然,用户可以运行并手动编辑其初始化脚本。 但我想使这一步骤自动化。我可以创建一个新的distutils命令,但不调用它。而且我可以扩展,但是安装会通过pip中断(尽

  • 问题内容: 我研究了,但是示例仅涉及使其重现。我正在寻找一种类似的功能,例如说“每个星期一的凌晨1点执行此任务”的功能。 问题答案: 感谢Patrick Altman,最近发布的1.0.3版现在支持此功能。 例: