public class TestRuntime { private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3); static { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { close(); } })); } private static void close() { try { System.out.println("clean"); executorService.shutdown(); System.out.println(executorService.awaitTermination(10000, TimeUnit.SECONDS)); System.out.println("end"); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } final int index = i; try { executorService.schedule(new Runnable() { @Override public void run() { System.out.println("yes" + index); } }, 3, TimeUnit.SECONDS); System.out.println("add thread"); } catch (Exception e) { } } } }
本想jvm关闭前优雅的关闭线程池,谁知通过kill -9 pid或windows taskkill /pid pid -t -f 强制关闭,无法触发。linux kill pid 可以触发,windows还没有找到触发的(以上例子从网上找的)