Warning, this is not what you should do. Common reasons apply to prevent the use of the solar pack. Think three times before using this in real code. At a minimum, access to signal processing should be done with reflection and return to registering a regular interrupt at shutdown. I left this for short.
So all hope will leave you, you who enter here:
import java.util.concurrent.atomic.AtomicBoolean; import sun.misc.Signal; import sun.misc.SignalHandler; public class Sigint { private static void prepareShutdownHandling() { // This would be the normal shutdown hook final Thread shutdown = new Thread() { @Override public void run() { // Simulate slow shutdown for (int i = 0; i < 10; i++) { System.out.println("Normal shutdown running"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(System.err); } } System.out.println("Normal shutdown finished"); System.exit(0); } }; Signal.handle(new Signal("INT"), new SignalHandler() { private AtomicBoolean inShutdown = new AtomicBoolean(); public void handle(Signal sig) { if (inShutdown.compareAndSet(false, true)) { // Normal shutdown shutdown.start(); } else { System.err.println("Emergency shutdown"); System.exit(1); } } }); } public static void main(String args[]) { prepareShutdownHandling(); while (true) { System.out.println("Main program running"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(System.err); } } } }
source share