java - 当计划的进程完成时,如何正确终止我的java程序?

标签 java executorservice

我有一个简单的java程序,用于生成元素并在特定时间每X秒将它们插入数据库中。

生成是通过scheduleAtFixedRate完成的。只有其中之一。

我希望我的程序在计划任务结束时完全退出。为此,我在取消任务时使用 System.exit(),但这是执行此操作的正确方法吗?

这是我当前的代码:

public static void main(String[] args) throws InterruptedException {

        c = generateDbConnection(url, user, password);

        if (c != null) {
            s = generateDbStatement(c);
        } else {
            System.out.println("ERROR");
            return;
        }
        initialTimestamp = new Date();
        TimeUnit.SECONDS.sleep(1);
        generateForAnHour();

    }

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

    /**
     * Generator thread handler Uses Statement from main function
     */
    public static void generateForAnHour() {
        final Runnable runner = new Runnable() {
            public void run() {
                String[][] data = new String[numberOfIds][2];
                for (int i = 0; i < numberOfIds; i++) {
                    data[i] = generateDevice();
                    insertDevice(s, data[i][0], data[i][1]);
                }
                quantityOfIds += numberOfIds;
            }
        };

        final ScheduledFuture<?> generatorHandle = scheduler.scheduleAtFixedRate(runner, 0, 5, TimeUnit.SECONDS);
        scheduler.schedule(new Runnable() {
            public void run() {
                generatorHandle.cancel(true);
                System.out.println("Scheduled ID generator terminated.");
                System.exit(0); //TODO Is it really correct way to do it
            }
        }, timeToRun, TimeUnit.SECONDS);
    }

最佳答案

如果程序还有更多功能,我不确定这是否是停止执行程序的正确方法,但我个人认为这是一种不错的方法。 :D

因此,事实证明,ScheduledExecutorService 似乎使用其默认的 ThreadFactory 创建非守护线程,也许我们需要为其提供一个守护线程。

但是,如果我们要调用 ExecutorService#shutdown 或强制的 ExecutorService#shutdownNow,它将停止这两个任务的执行,从而删除该线程阻止应用程序结束其工作:

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

public static void main(String[] args) {
    // Some service code here
    generateForAnHour();
}

public static void generateForAnHour() {
    // Some code that does work
    final Runnable runner = () -> System.out.println("Running...");

    final ScheduledFuture<?> generatorHandle = scheduler.scheduleAtFixedRate(runner, 0, 1, TimeUnit.SECONDS);
    // Code that interrupts the worker after a specified time
    scheduler.schedule(scheduler::shutdown, 5, TimeUnit.SECONDS);
}

输出:

Running...
Running...
Running...
Running...
Running...
Running...

Process finished with exit code 0

我希望这会有所帮助。 :D

关于java - 当计划的进程完成时,如何正确终止我的java程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59427598/

相关文章:

java - Java ExecutorService死锁?

Java 执行器和长生命周期线程

java - 在android中设置整数的最大值

java - 如何比较两个日期,如果一个日期小于另一个日期

java - 为什么不调用检查 NULL 的 Optional.isEmpty() isNull()

java - 程序如何保证使用执行器框架同时执行多个线程

java - 使用 Java 的 Web 服务自动化

java - 如何使用pdfbox获取字段的位置?

java - 如果发生异常则退出 Java Callable

java - Thread.sleep 导致 ExecutorService 循环中发生意外行为