如何在计划的进程完成后正确杀死我的Java程序?

问题描述 投票:2回答:1

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

[[0]生成完成。只有其中之一。

我希望我的程序在计划的任务结束后完全退出。为此,我在取消任务时使用scheduleAtFixedRate,但这是正确的方法吗?

这是我当前的代码:

System.exit()
java executorservice
1个回答
0
投票

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

因此,事实证明,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); } 似乎使用其默认值ScheduledExecutorService创建了非守护程序线程,也许我们需要为其提供守护程序。

但是,如果我们要调用ThreadFactory或强制性的Executor#shutdown,它将停止执行两个任务,因此删除了阻止应用程序结束其工作的线程:

Executor#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);
}

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

© www.soinside.com 2019 - 2024. All rights reserved.