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還沒有找到觸發的(以上例子從網上找的)