ShutdownHookManager { private ShutdownHookManager() { } private  ShutdownHookManager(); static ShutdownHookManager get(); void addShutdownHook(Runnable shutdownHook, int priority); boolean removeShutdownHook(Runnable shutdownHook); boolean hasShutdownHook(Runnable shutdownHook); boolean isShutdownInProgress(); void clearShutdownHooks();  }
@Test public void shutdownHookManager() { ShutdownHookManager mgr = ShutdownHookManager.get(); Assert.assertNotNull(mgr); Assert.assertEquals(0, mgr.getShutdownHooksInOrder().size()); Runnable hook1 = new Runnable() { @Override public void run() { } }; Runnable hook2 = new Runnable() { @Override public void run() { } }; mgr.addShutdownHook(hook1, 0); Assert.assertTrue(mgr.hasShutdownHook(hook1)); Assert.assertEquals(1, mgr.getShutdownHooksInOrder().size()); Assert.assertEquals(hook1, mgr.getShutdownHooksInOrder().get(0)); mgr.removeShutdownHook(hook1); Assert.assertFalse(mgr.hasShutdownHook(hook1)); mgr.addShutdownHook(hook1, 0); Assert.assertTrue(mgr.hasShutdownHook(hook1)); Assert.assertEquals(1, mgr.getShutdownHooksInOrder().size()); Assert.assertTrue(mgr.hasShutdownHook(hook1)); Assert.assertEquals(1, mgr.getShutdownHooksInOrder().size()); mgr.addShutdownHook(hook2, 1); Assert.assertTrue(mgr.hasShutdownHook(hook1)); Assert.assertTrue(mgr.hasShutdownHook(hook2)); Assert.assertEquals(2, mgr.getShutdownHooksInOrder().size()); Assert.assertEquals(hook2, mgr.getShutdownHooksInOrder().get(0)); Assert.assertEquals(hook1, mgr.getShutdownHooksInOrder().get(1)); }