java語言中application異常退出和線程異常崩潰的捕獲方法,而且在捕獲的鉤子方法中進行異常處理

一、application應用程序注入自定義鉤子程序java

java語言自己提供一個很好的Runtime類,能夠使咱們很好的獲取運行時信息。其中有一個方法是 public void addShutdownHook(Thread hook) ,經過這個方法咱們能夠獲取主線程或者說application項目被kill殺死獲取異常退出時候的鉤子事件。咱們通常會在這個事件中處理一些釋放資源,通知,報警等信息,這樣咱們就能夠不用翻log日誌了。服務器

注意:對於kill -9 這樣暴力結束應用程序的方式不起做用,因此通常服務器上中止正在運行的服務很忌諱使用kill -9 命令進行操做;app

具體實現代碼以下:this

public class ApplicationHook {

    public static void main(String[] args) {

        Runtime.getRuntime().addShutdownHook(new Thread(()->{
            System.out.println(Thread.currentThread().getName() + "this application will close...");
        },"thread-su-hook"));

        new Thread(()->{

            do{
                System.out.println(Thread.currentThread().getName() + " is working ...");
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }while(true);


        },"thread-su-0").start();


    }

}

   輸出結果:spa

 

二、Thread線程的異常拋出通常都是在run方法內部進行消化,可是對於runtime的異常,Thread線程顯得無能爲力,因此Thread類自己提供了一個方法來實現對於特殊的runtime錯誤進行捕獲setUncaughtExceptionHandler ;線程

具體代碼以下:日誌

public class ThreadHook {

    public static void main(String[] args) {

        final int a = 100;
        final int b = 0;
        Thread t = new Thread(()->{
            int count = 0;
            Optional.of(Thread.currentThread().getName() + " is begin work...").ifPresent(System.out::println);
            do{
                count++;
                Optional.of(Thread.currentThread().getName() + " count is : " + count).ifPresent(System.out::println);
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }while (count<5);
            Optional.of(Thread.currentThread().getName() + " is end work...").ifPresent(System.out::println);
            System.out.println(a/b);
        });
        t.setUncaughtExceptionHandler((thread,e)->{
            System.out.println(thread.getName() + " is custom uncaught exception ...");
        });
        t.start();



    }

  輸入結果:blog

 

 

但願能幫到須要的朋友,謝謝。。。事件

相關文章
相關標籤/搜索