当前位置: 首页 > 面试题库 >

如何停止ScheduledExecutorService?

苍和裕
2023-03-14
问题内容

该程序在九次打印后完成:

class BeeperControl {

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public void beep() {
        final Runnable beeper = new Runnable() {
            public void run() {
                System.out.println("beep");
            }
        };
        final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
                beeper, 1, 1, SECONDS);
        scheduler.schedule(new Runnable() {
            public void run() {
                beeperHandle.cancel(true);
            }
        }, 1 * 9, SECONDS);
    }

    public static void main(String[] args) {
        BeeperControl bc = new BeeperControl();
        bc.beep();
    }
}

如何停止进程(例如eclipse中的Java进程),因为它在9秒的时间限制后没有停止?


问题答案:

您遇到的问题是,取消哔声任务后,调度程序会保留活动线程。

如果存在活动的非守护程序线程,则JVM保持活动状态。

它使该线程保持不变的原因是您已在此行中告诉它这样做:

private final ScheduledExecutorService scheduler
        = Executors.newScheduledThreadPool(1);

请注意以下文档newScheduledThreadPool(int corePoolSize)

corePoolSize -即使在空闲状态下要保留在池中的线​​程数。

因此,您有两种可能的方法来导致JVM终止:

  1. 传递0newScheduledThreadPool而不是1。调度程序将不保留活动线程,并且JVM将终止。

  2. 关闭调度程序。无论如何,您应该这样做以释放其资源。因此,将run您的匿名帐户更改Runnable为:

    public void run() {
    beeperHandle.cancel(true);
    scheduler.shutdown();
    

    }

(实际上,您不需要cancel那里-该操作shutdown将在下一次“提示音”完成后立即生效。)



 类似资料:
  • 问题内容: 我有一个goroutine,它调用一个方法,并在通道上传递返回的值: 如何停止这种goroutine? 问题答案: 编辑: 在意识到您的问题是关于将值发送到goroutine中的chan之前,我匆忙编写了此答案。 下面的方法可以与上面建议的其他chan一起使用,或者利用您已经拥有的chan双向的事实,您可以只使用一个… 如果您的goroutine仅用于处理来自chan的项目,则可以使用

  • 问题内容: 要找出mysqld的启动命令(使用Mac),我可以这样做: 我得到以下输出,这使我可以启动mysql服务器。 我如何找到必要的命令以从命令行停止mysql? 问题答案: 尝试: 要么: 要么: 要么: 如果 在OSX中 安装 Launchctl,则 可以尝试: MacPorts 注意:重新启动后,此设置将持续存在。 家酿 二进制安装程序 我发现在:https : //stackover

  • 我正在使用ScheduledExecutorService并对其进行初始化(ScheduledExecutorService scheduledThreadPool=Executors.NewScheduledThreadPool(20);)这样我就不会每次都创建新线程。然后,我使用计划“executorService.schedule(new Runnable(),20,timeUnit.sec

  • 问题内容: 如何停止块枚举? 我知道在obj-c中,您可以这样做: 问题答案: 在Swift 1中: 在Swift 2中: 在Swift 3-4中:

  • 我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。

  • 问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是,如果将其强行杀死(),它们将不会执