java - 如何停止 ScheduledExecutorService?

标签 java executorservice

程序在九次打印后结束:

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 秒的时间限制后没有停止?

最佳答案

您遇到的问题是,在您取消蜂鸣任务后,调度程序会保留一个 Activity 线程。

如果有 Activity 的非守护线程,JVM 将保持 Activity 状态。

它保留此线程的原因是您已在这一行中告诉它这样做:

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

注意newScheduledThreadPool(int corePoolSize)的文档:

corePoolSize - the number of threads to keep in the pool, even if they are idle.

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

  1. 0 而不是 1 传递给 newScheduledThreadPool。调度程序不会保留 Activity 线程,JVM 将终止。

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

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

(事实上,您不需要那里的cancel - shutdown 将在下一次“哔”声完成后立即生效。)

关于java - 如何停止 ScheduledExecutorService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34202701/

相关文章:

Java 并发 : How can I tell which Future belongs to which Callable during processing?

java - Android - 从 onCreate 重新启动部分

javascript - 自动以Java/Javascript搜索YouTube内容

java - ExecuterService 停止处理两个线程中的一个

java - 将 ExecutorService 与要执行的任务树一起使用

java - 如何在 FutureTask 中捕获异常

java - 不确定我正在使用继承/多态性问题吗?

java - 单击最大化按钮时我的挥杆安排不清楚

java hibernate数据库连接

java - 为什么 JList 参数化没有破坏 Java 中的兼容性?