Зависит от Timer
, на который было запланировано TimerTask
: если это Timer
было создано , а не для выполнения своих задач в качестве демонов, ожидающий TimerTask
будет поддерживать виртуальную машину даже после того, как основной поток закончил свою работу. Это относится ко всем Timer
конструкторам, которые не принимают аргумент boolean
или где аргумент boolean
равен false
.
Кажется, что следующее работает как задумано:
package com.example.daemon;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class SampleDaemon {
private static Timer testTimer = new Timer(false);
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Received shutdown request!");
if (testTimer != null)
testTimer.cancel();
testTimer = null;
}
});
testTimer.schedule(new TestTimerTask(), new Date(), 2000);
}
private static class TestTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("Still running…");
}
}
}
Он печатает Still running…
каждые 2 секунды. Когда JVM получает SIGTERM
, программа печатает Received shutdown request!
и завершает работу. Это также можно сделать, отправив Ctrl + C с консоли. SIGHUP
делает то же самое, что и SIGTERM
.
SIGCONT
не имеет никакого эффекта; SIGUSR1
приводит к жесткому выходу (предположительно, так же, как SIGKILL
), т.е. без выполнения ловушки отключения.