`
zzhonghe
  • 浏览: 248250 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

线程外捕获某个线程内异常的方法

    博客分类:
  • Java
阅读更多
由于线程本质的特性,我们并不能直接捕获从线程中逃逸的异常,一旦异常逃逸出run方法,那它就直接上控制台了。

    /*
     * 1.Thread的异常在Thread外面是捕获不到的
     */
    public static void testThreadException(){
        ExecutorService se=Executors.newCachedThreadPool();
        try{
            se.execute(new Runnable(){
                public void run() {
                    throw new RuntimeException("TestException");
                }
            });
        }catch(RuntimeException e){
            //下面这条语句是执行不到的
            System.out.println("Message: "+e.getMessage());
        }
    }


我们只有通过设定回调类,传入回调的方法,这样才能够实现在外部处理线程中的异常:

    /*
     * 为某个批次的线程设置异常捕获器,通过ThreadFactory完成
     */
    public static void testCaughtThreadException(){
        ExecutorService se=Executors.newCachedThreadPool(new ThreadFactory(){
            public Thread newThread(Runnable r) {
                Thread t=new Thread(r);
                t.setUncaughtExceptionHandler(new UncaughtExceptionHandler(){
                    public void uncaughtException(Thread t, Throwable e) {
                        e.printStackTrace();
                        System.out.println("caught by myself"+e.getMessage());
                    }});
                return t;
            }
        });
        se.execute(new Runnable(){
            public void run() {
                throw new RuntimeException("TestException");
            }
        });
    }
    
    /*
     * 设定静态的异常捕获器,为所有的Thread异常添加捕获机制
     */
    static{
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(){
            public void uncaughtException(Thread t, Throwable e) {
                e.printStackTrace();
                System.out.println("caught by myself"+e.getMessage());
            }}
        );
    }
    public static void testCaughtAllThreadException(){
        ExecutorService se=Executors.newCachedThreadPool();
        se.execute(new Runnable(){
            public void run() {
                throw new RuntimeException("TestException");
            }
        });
    }
    
分享到:
评论

相关推荐

    一个线程捕获另外一个线程的异常1---马克-to-win java视频

    一个线程捕获另外一个线程的异常1---马克-to-win java视频

    UI界面多线程简单实现和线程捕获异常问题

    此外,可以使用`Thread.UnhandledException`事件来捕获线程级别的未处理异常,防止程序意外终止: ```csharp AppDomain.CurrentDomain.UnhandledException += (sender, e) => { // 记录或显示异常信息,然后关闭...

    Java多线程之多线程异常捕捉

    在这个例子中,尽管我们在main方法中尝试捕获异常,但线程在run方法中抛出的异常并不会被捕获。异常信息会被直接打印到控制台,导致程序无法正常处理异常。 那么,如何在多线程环境中捕获并处理异常呢?以下是一种...

    一个线程捕获另外一个线程的异常2---马克-to-win java视频

    一个线程捕获另外一个线程的异常2---马克-to-win java视频

    delphi线程异常处理

    总之,Delphi线程异常处理涉及到对线程的创建、异常捕获、资源清理以及线程间的通信。正确处理线程异常能提高程序的稳定性和健壮性,同时减少用户遇到的问题,提升用户体验。理解并熟练应用这些概念对于开发高质量的...

    基于java的线程错误捕获工具 CheckThread.zip

    3. **Thread.setUncaughtExceptionHandler()**: 这个方法允许为特定线程设置自定义的未捕获异常处理器。这使得开发者可以对每个线程进行定制化的错误处理。 4. **异常链**: 在Java中,异常可以携带有关导致它们的...

    WPF程序全局异常捕获示例

    以上就是WPF应用程序全局异常捕获的基本方法。通过正确处理UI线程、Task任务以及非UI线程的异常,可以显著提高应用的稳定性和用户体验。在实际项目中,除了显示错误信息,你还可以选择记录日志、发送错误报告或者...

    Java线程错误捕获工具 CheckThread

    1. **全局异常监听**:该工具可能包含一个全局的异常监听器,它可以在任何线程抛出未捕获异常时被触发。这样,开发者就可以在一处统一处理所有的异常,而无需在每个线程中都设置单独的异常处理器。 2. **日志记录**...

    基于Java的线程错误捕获工具 CheckThread.zip

    在开发过程中,理解和掌握线程错误捕获工具的使用方法是至关重要的,它可以帮助开发者提前预防和解决可能出现的问题,提高软件的质量和可靠性。同时,理解Java的线程模型和并发控制机制,如`synchronized`关键字、`...

    基于java的开发源码-线程错误捕获工具 CheckThread.zip

    在多线程环境下,当一个线程抛出未捕获的异常时,如果没有设置特定的处理机制,这个异常会终止线程的执行,但不会影响其他线程。为了防止这种情况,我们可以为线程设置一个全局的未捕获异常处理器,这样在任何线程中...

    子线程任务发生异常,主线程事务如何回滚

    下面将从多线程编程的基础知识、线程池的使用、异常捕获三个方面进行阐述。 一、多线程编程基础知识 在 Java 中,存在两种线程模型:主线程和子线程。主线程是程序的入口点,而子线程是由主线程创建的辅助线程。...

    java源码:Java线程错误捕获工具 CheckThread.zip

    1. **线程异常处理器类(ThreadExceptionHandler)**:这是实现`Thread.UncaughtExceptionHandler`接口的类,其中`uncaughtException`方法是核心,它接收两个参数,一个是出现异常的线程对象,另一个是未捕获的异常...

    基于Java的实例源码-线程错误捕获工具 CheckThread.zip

    然而,线程在运行过程中可能会遇到各种错误和异常,如死锁、竞态条件、空指针异常等,这些都需要程序员有效地捕获和处理。"CheckThread"是一个用于线程错误捕获的实用工具,它可以帮助开发者在多线程环境中监控和...

    java 多线程异常处理

    1. **局部化异常处理**:尽可能将`try-catch`块放在最小的代码范围内,只捕获你需要处理的异常。 2. **捕获具体异常**:优先捕获更具体的异常,然后再捕获更通用的异常,这样可以提供更精确的错误信息。 3. **使用...

    Android 全局异常捕获

    全局异常捕获是指在应用的整个生命周期内,无论在哪个线程或者哪个函数中,只要发生未被捕获的异常,都能被一个统一的处理机制捕获并进行相应的处理。这样可以避免因为单一代码块的异常而导致整个应用崩溃,同时也为...

    Java线程错误捕获工具 CheckThread.7z

    Java线程错误捕获工具CheckThread是一款专门针对Java多线程编程中可能出现的错误和异常进行检测和诊断的实用工具。在多线程环境中,由于并发执行和共享资源的特性,错误和异常的发生往往难以预测且难以定位。...

    WinForm捕获未处理的异常

    MessageBox.Show("UI线程内的异常:" + e.Exception.Message); } ``` #### 2. 使用`AppDomain.UnhandledException`事件 除了`ThreadException`,还可以监听`AppDomain`级别的`UnhandledException`事件,这可以...

    详解Java中多线程异常捕获Runnable的实现

    Java 多线程异常捕获 Runnable 实现详解 Java 多线程编程是一个非常重要的知识点,然而在多线程编程中,异常捕获是一个很大的挑战。本文主要介绍了 Java 中多线程异常捕获 Runnable 的实现,包括背景、工具、思路、...

    java项目史上最简单的多线程使用方法(demo)

    可以使用`try-catch-finally`结构来捕获和处理线程中的异常。 五、测试与调试 "thread-test"项目可能包含单元测试,使用JUnit或TestNG等框架,确保多线程逻辑的正确性。同时,使用`Thread.sleep()`可以模拟延迟,...

    线程的几个重要方法.doc

    需要注意的是,`sleep()`方法抛出`InterruptedException`,因此通常需要捕获该异常。 5. `stop()`方法 `stop()`方法已废弃,因为它可能引发不安全的线程终止。通常,推荐通过修改线程内部的循环条件来停止线程。 6...

Global site tag (gtag.js) - Google Analytics