美文网首页
Java多线程异常处理

Java多线程异常处理

作者: zyangela | 来源:发表于2019-08-11 21:12 被阅读0次

线程异常处理

Java中每个线程的异常处理是相互独立的,一个线程产生的异常不会影响其他线程的正常运行。因此,也不能在一个线程中catch另一个线程中抛出的异常。
例如,下面这段代码试图catch方法exceptionInThread()中的异常

 public static void main(String[] args) {
        try{
            exceptionInThread();
        } catch (Exception e) {
            System.out.println("catch exception in the main thread");
        }
    }

    public static void exceptionInThread() {
        Thread t = new Thread(() -> {
            throw new RuntimeException("something wrong in thread");
        });
        t.start();
    }

但如下实际的运行结果可以发现异常并没有被catch住。

线程异常
在Java中可以通过设置Thread.UncaughtExceptionHandler处理线程中的异常。例如下面的代码段中设置了线程的默认UncaughtExceptionHandler.
private static Thread.UncaughtExceptionHandler uncaughtExceptionHandler = (Thread t, Throwable e) -> {
        StringBuilder sb = new StringBuilder();
        sb.append("Thread name: ")
                .append(t.getName())
                .append(", caught exception: ")
                .append(e.getClass())
                .append(" [")
                .append(e.getMessage())
                .append("]");
        System.out.println(sb.toString());
    };

    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler);
        try{
            exceptionInThread();
        } catch (Exception e) {
            System.out.println("catch exception in the main thread");
        }
    }

    public static void exceptionInThread() {
        Thread t = new Thread(() -> {
            throw new RuntimeException("something wrong in thread");
        });
        t.start();
    }

运行结果为:


Thread.UncaughtExceptionHandler

线程池异常处理

Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler);对线程池中抛出的异常也有同样的效果。
完整代码段如下所示:

package examples;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultilThreadExceptionHandler {
    private static Thread.UncaughtExceptionHandler uncaughtExceptionHandler = (Thread t, Throwable e) -> {
        StringBuilder sb = new StringBuilder();
        sb.append("Thread name: ")
                .append(t.getName())
                .append(", caught exception: ")
                .append(e.getClass())
                .append(" [")
                .append(e.getMessage())
                .append("]");
        System.out.println(sb.toString());
    };

    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler);
        exceptionInThreadPool();
        exceptionInThread();
    }

    public static void exceptionInThread() {
        Thread t = new Thread(() -> {
            throw new RuntimeException("something wrong in thread");
        });

        t.start();
    }

    public static void exceptionInThreadPool() {
        ExecutorService threadPool = Executors.newFixedThreadPool(1 );

        threadPool.execute(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            throw new RuntimeException("exception in runnable");
        });
        threadPool.shutdown();
    }

}

TODO

在测试过程中发现,线程池中task通过threadPool.execute提交的runnable中的异常可以被UncaughtExceptionHandler正确处理,但通过threadPool.submit提交的callable中的异常却无法处理。需要进一步阅读源码了解其中机制。

相关文章

  • Java多线程异常处理

    线程异常处理 Java中每个线程的异常处理是相互独立的,一个线程产生的异常不会影响其他线程的正常运行。因此,也不能...

  • Java后端知识体系

    基础重点(必须扎实) Java语言 语言基础 《Java核心技术》基础语法面向对象常用API异常处理集合IO多线程...

  • Java 最佳实践的经验

    Java 最佳实践的面试问题 包含 Java 中各个部分的最佳实践,如集合,字符串,IO,多线程,错误和异常处理,...

  • 2018-07-05学习

    1.认清自己 有一定的Java基础,但是对面向对象概念、集合的概念、io、多线程、并发、处理异常、Java网络编程...

  • Java- 异常处理

    Java- 异常处理 异常处理能够使一个方法给它的调用者抛出一个异常。 Java异常是派生自 java.lang....

  • Java面试题

    Java面试 Java、框架、JVM Java 基础、容器、多线程、反射、对象拷贝、Java web模块、异常模块...

  • JNI异常

    JNI异常 JNI允许native方法引发任意Java异常。native代码还可以处理未解决的Java异常。未处理...

  • Android 学习流程

    1、java * 基础语法 * 面向对象 * 集合 * 多线程 * 异常 异常机制原理 自定义异常 * 输入、输出...

  • (五) volatile关键字

    Java多线程目录 1 背景 理解Java多线程的内存抽象逻辑请阅读java多线程内存模型,当代操作系统,处理器为...

  • Java 异常分析

    本文是对以下内容的分析: Java异常设计 Java 异常分类 Java异常可以告诉什么问题 Java异常处理最佳...

网友评论

      本文标题:Java多线程异常处理

      本文链接:https://www.haomeiwen.com/subject/jkpdjctx.html