Runtime.getRuntime().addShutdownHook的坑

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章