008 线程异常的研究

一 .概述

  我们知道一个线程运行之后,它会另外开启一个线程栈来完成自己的任务的运行,此时异常的捕获就是一个问题.



二 .异常的演示 

public static void main(String[] args) {
        try {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    throw new RuntimeException();
                }
            }).start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我们运行上述的程序,结果如下:  

Exception in thread "Thread-0" java.lang.RuntimeException
    at com.trek.concurrency.exception.ExceptionTest$1.run(ExceptionTest.java:10)
    at java.lang.Thread.run(Thread.java:745)

我们发现我们根本无法捕获线程抛出的异常,仅仅就是打印了一个线程的堆栈信息.



三 . 使用线程异常处理器完成任务 

public class ExceptionHandler {

    static class Handler implements UncaughtExceptionHandler{
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            //在此处我们只需要打印一下信息就好了
            System.out.println("线程的名字: "+t.getName());
            System.out.println(e);
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                throw new RuntimeException("我抛出了一个异常信息");
            }

        });
        thread.setUncaughtExceptionHandler(new Handler());
        thread.start();
    }
}

首先,我们定义了一个内部类为异常处理器.

  然后我们在创建线程的时候绑定一个异常处理器对象的实例.

  当我们的线程抛出一个异常的时候,异常处理器就会捕获这个异常.

我们查看结果:  

线程的名字: Thread-0
java.lang.RuntimeException: 我抛出了一个异常信息

我们发现线程抛出的异常信息我们可以捕获到了.

原文地址:https://www.cnblogs.com/trekxu/p/8995738.html

时间: 2024-10-13 23:39:46

008 线程异常的研究的相关文章

线程异常:undefined reference to 'pthread_create' 处理

源码: #include <stdio.h> #include <pthread.h> #include <sched.h> void *producter_f (void *arg); void *consumer_f (void *arg); int buffer_has_item=0; pthread_mutex_t mutex; int running =1 ; int main (void) { pthread_t consumer_t; pthread_t

JAVA并发,线程异常捕获

由于线程的特性,当我们启动了线程是没有办法用try catch捕获异常的,如下例: 1 package com.xt.thinks21_2; 2 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 6 /** 7 * 线程异常捕获测试 8 * 9 * @author xue 10 * 11 */ 12 public class ThreadUncaughtExcepti

如何捕获子线程异常

一 直接在主线程捕获子线程异常(此方法不可取) using System; using System.Threading; namespace CatchThreadException { class Program { static void Main(string[] args) { try { Thread t = new Thread(() => { throw new Exception("我是子线程中抛出的异常!"); }); t.Start(); } catch (

JAVA Thread线程异常监控

一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 public class NoCaughtThread implements Runnable{ @Override public void run() { System.out.println(3 / 2); System.out.println(3 / 0); System.out.println(3

c#.net的网站出现“正在中止线程””异常的原因和解决方法

出现“正在中止线程”异常通常都是由于以下三种原因导致引起,给出解决方案如下: 解决方案: 1.针对Response.End,调用 HttpContext.Current.ApplicationInstance.completeRequest() 方法而不是 Response.End 以跳过 Application_EndRequest 事件的代码执行. 2.针对Response.Redirect,请使用重载 Response.Redirect(String url, bool endRespon

Response.End()、Response.Redirect()、Server.Transfer()导致“正在中止线程”异常的问题

try {     if (true)           {                Response.Write("测试1");                Response.End();            }    else            { if (true)                {                     Response.Write("测试2");                     Response.E

截取线程异常的方法

对于线程里面的异常,如果线程里面没有抓获异常会到导致整个进程crash. 这主要是由于每个线程有单独的异常栈,如果在线程内部没有抓获异常,CLR会把异常直接传到system core层,导致进程被kill掉. 这是可以使用ContinueWith()调用其它函数来继续执行,新执行的方法应该是继承报错的线程的线程上下文和异常栈的,所以才可以处理异常,不至于异常传到系统内核导致进程崩溃. var task = Task.Factory.StartNew(() => { throw new Excep

3、Java多线程-处理子线程异常

处理子线程异常(重要).参考:https://www.cnblogs.com/jpfss/p/10272066.html1.Java子线程中的异常处理 父线程中启动子线程,直接在父线程启动子线程的地方try...catch,是捕获不到子线程的异常的 原因:Runnable接口的run方法的完整签名,因为没有标识throws语句,所以方法是不会抛出checked异常的.至于RuntimeException这样的 unchecked异常,由于新线程由JVM进行调度执行,如果发生了异常,也不会通知到父

一次由于Java内存管理机制导致的线程异常阻塞之旅

引言 一转眼已经两年多没写多博客了:一转眼也要快工作两三年了:一转眼我又开始写Java代码了.希望自己可以坚持写写博客,总结总结的习惯!加油. 今天在调试代码的时候,发现两个毫不相关的thread用jstack看竟然其中一个在等待另一个的线程持有的锁,很是奇怪.经过研究,是因为Integer类的实现机制导致的. 一.异常阻塞代码 1 package xxx; 2 3 public class TestDeadLock { 4 public static void main(String[] ar