10.多线程学习--处理线程组内的不受控制异常

package com.jackson.deng.concurrent.chapter1.ten;

import java.util.Random;

/**
 * function desc : 处理线程组内的不受控制异常
 * summary : 
 * 对于编程语言来说,一个非常重要的事情是提供管理应用出错情况的机制。
 * Java 语言,作为最现代的编程语言,实现except基于异常的机制来管理出错情况,它提供很多种类来表示不同的错误。
 * 当检测到一个异常状况时,这些异常会被Java类们抛出。你也可以使用这些异常, 或者实现你自己的异常, 来管理你的类产生的错误。
 * Java 也提供机制来捕捉和处理这些异常 。
 * 有些一定要被捕捉或者使用方法的throws句组再抛出,这些异常称为检查异常(checked exceptions)。
 * 有些异常不需要被捕捉,这些称为未检查异常(unchecked exceptions)。
 * 另一种可能是创建一个方法,捕获所有被ThreadGroup类的任何线程抛出的非捕捉异常。
 * 
 * analyze : 
 * The Thread 类有其他相关方法可以处理未捕获的异常。静态方法 setDefaultUncaughtExceptionHandler() 为应用里的所有线程对象建立异常 handler 。
 * 当一个未捕捉的异常在线程里被抛出,JVM会寻找此异常的3种可能潜在的处理者(handler)。
 * 首先, 它寻找这个未捕捉的线程对象的异常handle,如我们在在这个指南中学习的。
 * 如果这个handle 不存在,那么JVM会在线程对象的ThreadGroup里寻找非捕捉异常的handler,如在处理线程组内的不受控制异常里介绍的那样。
 * 如果此方法不存在,正如我们在这个指南中学习的,那么 JVM 会寻找默认非捕捉异常handle。
 * 如果没有一个handler存在, 那么 JVM会把异常的 stack trace 写入操控台并结束任务。
 * 
 * @author jackson
 *
 */
public class ProcessUnCaughtExceptionThreadGroup {

	public class Task implements Runnable {
		@Override
		public void run() {
			int result;
			Random r = new Random(Thread.currentThread().getId());
			while (true) {
				result = 1000 / ((int) (r.nextDouble() * 1000));
				System.out.printf("%s : %f\n", Thread.currentThread().getId(), result);
				if (Thread.currentThread().isInterrupted()) {
					System.out.println(Thread.currentThread().getId() + " : is interrupted");
					return;
				}
			}
		}
	}

	public class MyThreadGroup extends ThreadGroup {

		public MyThreadGroup(String name) {
			super(name);
		}

		@Override
		public void uncaughtException(Thread t, Throwable e) {
			System.out.printf("这线程%s出异常啦", t.getId());
			e.printStackTrace(System.out);
			System.out.println("终端线程");
			interrupt();
		}
	}

	public static void main(String[] args) {
		ProcessUnCaughtExceptionThreadGroup p = new ProcessUnCaughtExceptionThreadGroup();
		MyThreadGroup my = p.new MyThreadGroup("myGroup");
		Task task = p.new Task();
		for (int i = 0; i < 2; i++) {
			Thread thread = new Thread(my, task);
			thread.start();
		}
	}
}

运行结果:

9 : 8 : 这线程9出异常啦这线程8出异常啦java.util.IllegalFormatConversionException: f != java.lang.Integer
at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4045)
at java.util.Formatter$FormatSpecifier.printFloat(Formatter.java:2761)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:2708)
at java.util.Formatter.format(Formatter.java:2488)
at java.io.PrintStream.format(PrintStream.java:970)
at java.io.PrintStream.printf(PrintStream.java:871)
at com.jackson.deng.concurrent.chapter1.ten.ProcessUnCaughtExceptionThreadGroup$Task.run(ProcessUnCaughtExceptionThreadGroup.java:14)
at java.lang.Thread.run(Thread.java:745)
终端线程
java.util.IllegalFormatConversionException: f != java.lang.Integer
at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4045)
at java.util.Formatter$FormatSpecifier.printFloat(Formatter.java:2761)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:2708)
at java.util.Formatter.format(Formatter.java:2488)
at java.io.PrintStream.format(PrintStream.java:970)
at java.io.PrintStream.printf(PrintStream.java:871)
at com.jackson.deng.concurrent.chapter1.ten.ProcessUnCaughtExceptionThreadGroup$Task.run(ProcessUnCaughtExceptionThreadGroup.java:14)
at java.lang.Thread.run(Thread.java:745)
终端线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值