文档章节

并发编程实战 1.10. 线程组处理异常 - 重写uncaughtException()

火犀牛
 火犀牛
发布于 2016/05/11 17:56
字数 535
阅读 11
收藏 0
点赞 2
评论 0

线程组通过重写uncaughtException(Thread t, Throwable e)方法处理线程组异常。

范例: 查询文件(sleep),其中一个抛出异常,threadGroup处理异常后,全部进程都interrupt

自定义的线程组:

package com.rr.concurrent.chapter1.recipe11.test;

/**
 * Created by isaac_gu on 2016/5/11.
 */
public class MyThreadGroup extends ThreadGroup {
    public MyThreadGroup(String name) {
        super(name);
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("******************************** Exception Handler ******************************");

        System.out.printf("1. %s 线程出现了异常!\n", t.getName());
        System.out.printf("2. Exception: %s: %s\n", e.getClass().getName(), e.getMessage());
        System.out.printf("3. Stack Trace: \n");
        e.printStackTrace(System.out);
        System.out.printf("4. Thread status: %s\n", t.getState());
        System.out.println("******************************** Exception Handler END ******************************");

        //打断所有活动的线程
        interrupt();
    }
}

查找线程:

package com.rr.concurrent.chapter1.recipe11.test;

import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * Created by isaac_gu on 2016/5/11.
 */
public class SearchTask implements Runnable {
    @Override
    public void run() {
        System.out.printf("%s 线程开始查找!\n", Thread.currentThread().getName());
        //2秒后开始查找
        suspend(2);
        while (true) {
            //当除以0 的时候报异常
            int c = 1000 / new Random().nextInt(100);
            if (Thread.currentThread().isInterrupted()) {
                System.out.printf("%s 被打断!\n", Thread.currentThread().getName());
                return;
            }

            //每100微秒查询一次
            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e) {
                System.out.printf("%s 被打断!\n", Thread.currentThread().getName());
                return;
            }
        }
    }

    private void suspend(int s) {
        try {
            TimeUnit.SECONDS.sleep(s);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

测试:

package com.rr.concurrent.chapter1.recipe11.test;


/**
 * Created by isaac_gu on 2016/5/11.
 * 范例: 查询文件,其中一个抛出异常,threadGroup处理异常后,全部进程都interrupt
 */
public class Test {
    public static void main(String[] args) {
        MyThreadGroup myThreadGroup = new MyThreadGroup("myThreadGroup");
        SearchTask searchTask = new SearchTask();

        for (int i = 0, len = 10; i < len; i++) {
            new Thread(myThreadGroup, searchTask).start();
        }

        System.out.println("主线程结束!");
    }
}

运行结果:

Thread-0 线程开始查找!
Thread-5 线程开始查找!
Thread-9 线程开始查找!
Thread-1 线程开始查找!
Thread-7 线程开始查找!
Thread-3 线程开始查找!
Thread-8 线程开始查找!
Thread-4 线程开始查找!
Thread-6 线程开始查找!
Thread-2 线程开始查找!
******************************** Exception Handler ******************************
1. Thread-0 线程出现了异常!
2. Exception: java.lang.ArithmeticException: / by zero
3. Stack Trace: 
java.lang.ArithmeticException: / by zero
	at com.rr.concurrent.chapter1.recipe11.test.SearchTask.run(SearchTask.java:17)
	at java.lang.Thread.run(Thread.java:745)
4. Thread status: RUNNABLE
******************************** Exception Handler END ******************************
Thread-6 被打断!
Thread-9 被打断!
Thread-1 被打断!
Thread-3 被打断!
Thread-5 被打断!
Thread-2 被打断!
Thread-4 被打断!
Thread-7 被打断!
Thread-8 被打断!

 

© 著作权归作者所有

共有 人打赏支持
火犀牛
粉丝 0
博文 27
码字总数 12180
作品 0
海淀
程序员
Java并发编程初级篇(九):线程组

Java API提供了一个线程组类ThreadGroup,这个类提供了一些方法可以让我们方便地对加入这个线程组的多个线程进行操作。 想使用线程组首先需要实例化一个线程组对象,并把创建的线程加入到这个...

阿拉德大陆的魔法师 ⋅ 2016/11/23 ⋅ 0

关于未捕获异常(Uncaught Exception)的处理

我们经常使用try..catch进行异常处理,但是对于Uncaught Exception是没办法捕获的。对于这类异常如何处理呢? 回顾一下thread的run方法,有个特别之处,它不会抛出任何检查型异常,但异常会导...

Bruceshi ⋅ 2013/04/10 ⋅ 2

优雅的处理Android崩溃(一)

写在前面: Android崩溃是我们开发中不可避免的异常处理,通常崩溃都会触发系统的强制关闭对话框,用户点击后系统会强制关闭当前进程,用户体验及其不好。本文就简单介绍下怎么优雅的处理全局...

咖喱配胡椒 ⋅ 2017/08/14 ⋅ 0

Java并发编程初级篇(七):捕获线程中的运行时异常

Java API中为我们提供了一个用于捕获线程内部运行时异常的接口。实现这个接口并给线程指定异常捕获器就可以达到目的。 因为线程类的run()方法并不能抛出异常,所以如果不为线程指定UncaughtE...

阿拉德大陆的魔法师 ⋅ 2016/11/23 ⋅ 0

《Java多线程编程核心技术》读书笔记

《Java多线程编程核心技术》读书笔记。 第一章 Java多线程技能 使用Java多线程两种方式。 继承Thread类与实现Runnable接口。 线程的开始、中止、暂停、恢复、停止。 、、、、 线程的、、优先...

刀狂剑痴 ⋅ 2016/05/02 ⋅ 0

拿什么守护你的Node.JS进程: Node出错崩溃了怎么办?

被吐嘈的NodeJS的异常处理 许多人都有这样一种映像,NodeJS比较快; 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务; 它比较适合对并发要求比较高,而且简单的业务场景...

myownghost ⋅ 2014/09/16 ⋅ 4

线程的属性(优先级、守护线程、未捕获异常处理器)

1、线程优先级:每条线程都有一个优先级,默认情况下,主线程的优先级是5(NORPRIORITY),子线程继承它父线程的优先级。可以用setPriority方法给一条线程设置优先级(MINPRIORITY=1,MAX_PRI...

fleischer ⋅ 2012/11/30 ⋅ 0

线程中不可控异常的处理

在Java中有两种异常。 非运行时异常(Checked Exception):这种异常必须在方法声明的throws语句指定,或者在方法体内捕获。例如:IOException和ClassNotFoundException。 运行时异常(Unche...

柳哥 ⋅ 2015/04/26 ⋅ 0

Java多线程(全)学习笔记(中)

四.多线程的同步 以一个取钱列子来分析:(用户登录那些省略) Accout类: /*银行取钱,账户类/ public class Accout { //账户编号 private String accoutNo; //账户余额 private double b...

明舞 ⋅ 2014/07/27 ⋅ 0

Node出错导致运行崩溃的解决方案

许多人都有这样一种映像,NodeJS比较快; 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务; 它比较适合对并发要求比较高,而且简单的业务场景。 在Express的作者的TJ Ho...

黄欣怡 ⋅ 2017/06/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

istio 文档

https://istio.io/docs/concepts/ https://istio.io/docs/concepts/traffic-management/handling-failures/ https://istio.io/docs/concepts/traffic-management/rules-configuration/......

xiaomin0322 ⋅ 12分钟前 ⋅ 0

编程语言的作用及与操作系统和硬件的关系

一、编程语言的作用及与操作系统和硬件的关系 作用:编程语言是计算机语言,是一种程序员与计算机之间沟通的介质,通过编程语言可以使得计算机能够根据人的指令一步一步去工作,完成某种特定...

slagga ⋅ 23分钟前 ⋅ 0

runtime实现按钮点击事件

也不能说是实现吧,,,就是有点类似于RAC里边的写法,不用给btn添加另外的点击事件,就那个add...select...这样子很不友好,来看下代码: [self.btn handleControlEvent:UIControlEventTou...

RainOrz ⋅ 23分钟前 ⋅ 0

Windows系统运维转linux系统运维的经历

开篇之前,首先介绍一下我的背景把:我是一个三线城市的甲方运维。最近,在《Linux就该这么学》书籍的影响下和朋友小A(Linux运维已经三年了,工资也比我的高很多)的影响下,决定转行。最近...

linux-tao ⋅ 24分钟前 ⋅ 0

zip压缩工具,tar打包工具

zip压缩工具 zip打包工具跟前面说到的gzip,bz2,xz 工具最大的不一样是zip可以压缩目录。如果没有安装,需要使用yum install -y zip 来安装。安装完之后就可以直接使用了,跟之前提到的压缩...

李超小牛子 ⋅ 32分钟前 ⋅ 0

使用npm发布自己的npm组件包

一、注册npm账号 官网:https://www.npmjs.com/signup 注册之后需要进行邮箱验证,否则后面进行组件包发布时候会提示403错误,让进行邮箱核准。 二、本地新建一个文件夹,cd进入后使用npm i...

灰白发 ⋅ 34分钟前 ⋅ 0

010. 深入JVM学习—垃圾收集策略概览

1. 新生代可用GC策略 1. 串行GC(Serial Copying) 算法:复制(Copying)清理算法; 操作步骤: 扫描年轻代中所有存活的对象; 使用Minor GC进行垃圾回收,同时将存活对象保存到“S0”或“S...

影狼 ⋅ 34分钟前 ⋅ 0

JVM性能调优实践——JVM篇

在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践——性...

Java小铺 ⋅ 35分钟前 ⋅ 0

误关了gitlab sign-in 功能的恢复记录

本想关sign-up的,误点了sign-in 退出后登录界面提示: No authentication methods configured 一脸懵逼.. 百度后众多方案说修改application_settings 的 signin_enabled字段; 实际上新版本字段...

铂金蛋蛋 ⋅ 36分钟前 ⋅ 0

登录后,后续请求接口没有带登录cookie可能原因

1.XMLHttpRequest.withCredentials没设置好,参考https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/withCredentials...

LM_Mike ⋅ 36分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部