加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java 子线程异常处理

发布时间:2020-12-15 07:40:09 所属栏目:Java 来源:网络整理
导读:如何在父线程中捕获来自子线程的异常呢 方法一:子线程中try... catch... 方法二:为线程设置异常处理器UncaughtExceptionHandler (异常处理也是在子线程中执行,相当于在子线程中加上了一个异常拦截器,可以使用下面的程序验证) (1)Thread.setUncaughtE

如何在父线程中捕获来自子线程的异常呢

方法一:子线程中try... catch...

方法二:为线程设置异常处理器UncaughtExceptionHandler

(异常处理也是在子线程中执行,相当于在子线程中加上了一个异常拦截器,可以使用下面的程序验证)

(1)Thread.setUncaughtExceptionHandler设置当前线程的异常处理器

(2)Thread.setDefaultUncaughtExceptionHandler为整个程序设置默认的异常处理器

(3)new Thread(new ThreadTest(),new runable{})时传入 ThreadGroup?

方法三,通过Future的get方法捕获子线程异常

?

import java.util.concurrent.*;

public class ThreadTest extends ThreadGroup{

    private ThreadTest(){
        super("ThreadTest");
    }


    public static void main(String[] args) {

        System.out.println(Thread.currentThread().getId());

        Thread t1=new Thread(new ThreadTest(),new Runnable() {//传入继承ThreadGroup的类对象
            @Override
            public void run() {

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if (1==1){
                    throw new NullPointerException("111");
                }
            }
        });
        t1.start();


        /*ExecutorService executorService = Executors.newFixedThreadPool(8);
        Future future = executorService.submit(()->{
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (1==1){
                throw new NullPointerException("111");
            }
            return 1;
        });

        try {
            future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {

            //e.getCause().printStackTrace();
            e.printStackTrace();
        }
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executorService.shutdownNow();*/


    }

    public   void   uncaughtException(Thread   thread,Throwable   exception)
    {
        /**
         * 当线程抛出unckecked异常时,系统会自动调用该函数,但是是在抛出异常的线程内执行*/
        System.out.println(Thread.currentThread().getId());
        System.out.println(thread.getId());
        exception.printStackTrace();//example,print   stack   trace
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读