java中有两类异常:

已检查异常:这类异常编译器要求开发者必须在代码中通过throws去处理。

例如:IOException和ClassNotFoundException。

未检查异常:不必显式的在代码重处理。例如:NumberFormatException。

所有派生自Error和RuntimeException的类,都是未检查异常.其余的是已检查异常.

当一个已检查异常在线程对象的run()方法中抛出,我们就必须去捕捉并处理它,因为run()方法不接受throws条件。

而当一个未检查异常在run()方法中抛出,其默认行为是将异常信息输出到控制台并退出程序。

幸运的是,Java提供了在线程中捕捉和处理未检查异常的机制,以避免程序结束。

本例就来学习一下这一机制。

Task.java
package com.dylan.thread.ch1.c08.task;

/**
* Runnable class than throws and Exception
*
*/
public class Task implements Runnable { /**
* Main method of the class
*/
@Override
public void run() {
// The next instruction always throws and exception
int numero=Integer.parseInt("TTT");
} }
ExceptionHandler.java
package com.dylan.thread.ch1.c08.handler;

import java.lang.Thread.UncaughtExceptionHandler;

/**
* Class that process the uncaught exceptions throwed in a Thread
*
*/
public class ExceptionHandler implements UncaughtExceptionHandler { /**
* Main method of the class. It process the uncaught excpetions throwed
* in a Thread
* @param t The Thead than throws the Exception
* @param e The Exception throwed
*/
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("An exception has been captured\n");
System.out.printf("Thread: %s\n",t.getId());
System.out.printf("Exception: %s: %s\n",e.getClass().getName(),e.getMessage());
System.out.printf("Stack Trace: \n");
e.printStackTrace(System.out);
System.out.printf("Thread status: %s\n",t.getState());
} }
Main.java
package com.dylan.thread.ch1.c08.core;

import com.dylan.thread.ch1.c08.handler.ExceptionHandler;
import com.dylan.thread.ch1.c08.task.Task; /**
* Main class of the example. Initialize a Thread to process the uncaught
* exceptions and starts a Task object that always throws an exception
*
*/
public class Main { /**
* Main method of the example. Initialize a Thread to process the
* uncaught exceptions and starts a Task object that always throws an
* exception
* @param args
*/
public static void main(String[] args) {
// Creates the Task
Task task=new Task();
// Creates the Thread
Thread thread=new Thread(task);
// Sets de uncaugh exceptio handler
thread.setUncaughtExceptionHandler(new ExceptionHandler());
// Starts the Thread
thread.start(); try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.printf("Thread has finished\n"); } }

运行结果:

An exception has been captured
Thread: 10
Exception: java.lang.NumberFormatException: For input string: "TTT"
Stack Trace: 
java.lang.NumberFormatException: For input string: "TTT"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at com.dylan.thread.ch1.c08.task.Task.run(Task.java:16)
at java.lang.Thread.run(Thread.java:745)
Thread status: RUNNABLE
Thread has finished

Java并发编程实例--8.在线程中处理未检查异常的更多相关文章

  1. Java并发编程 | 从进程、线程到并发问题实例解决

    计划写几篇文章讲述下Java并发编程,帮助一些初学者成体系的理解并发编程并实际使用,而不只是碎片化的了解一些Synchronized.ReentrantLock等技术点.在讲述的过程中,也想融入一些相 ...

  2. Java并发编程:如何创建线程?

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  3. 【转】Java并发编程:如何创建线程?

    一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认是java.exe或者javaw.exe(windows下可以通过 ...

  4. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  5. [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...

    [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ... 摘要 介绍 Java 并发包里的几个主要 ExecutorService . 正文 ...

  6. 2、Java并发编程:如何创建线程

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  7. 原创】Java并发编程系列2:线程概念与基础操作

    [原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...

  8. Java 并发编程——Executor框架和线程池原理

    Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...

  9. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  10. [转载] java并发编程:Lock(线程锁)

    作者:海子 原文链接: http://www.cnblogs.com/dolphin0520/p/3923167.html 出处:http://www.cnblogs.com/dolphin0520/ ...

随机推荐

  1. [转帖]Nginx 安全优化

    目录 前言 1.使用 SSL/TLS 证书 2.使用安全密钥交换机制 3.禁用旧的 SSL/TLS 协议 4.禁用 SSL/TLS 弱密码套件 5.禁用不需要的 HTTP 方法 6.防止缓冲区溢出攻击 ...

  2. 快速部署minio的一个思路

    快速部署minio的一个思路 背景 小型项目上希望能够快速部署一些中间件. 因为minio比较简单,想着快速一键部署. 加快工作效率. 这里将脚本和思路写下来, 其他应用可以一样进行. 思路 1. 下 ...

  3. [转帖]PD Control 使用说明

    https://docs.pingcap.com/zh/tidb/stable/pd-control PD Control 是 PD 的命令行工具,用于获取集群状态信息和调整集群. 安装方式   注意 ...

  4. FIO的再学习-不同Raid,不同磁盘性能验证

    FIO的再学习-不同Raid性能验证 背景 发现自己对iodepth的和num_jobs的理解存在偏差 找了一些资料才发现自己很多地方做的不对. 这里找到一个新资料可以进行模拟数据库的测试 测试配置文 ...

  5. [转帖]Kafka 核心技术与实战学习笔记(七)kafka集群参数配置(上)

    一.Broker 端参数 Broke存储信息配置 log.dirs:非常重要,指定Broker需要使用的若干文件目录路径,没有默认值必须亲自指定. log.dir:他只能表示单个路径,补充上一个参数用 ...

  6. [转帖]shell删除文件前几行或后几行

    https://www.cnblogs.com/1394htw/p/14852207.html shell删除文件前几行或后几行 #!/bin/bash #删除前两行 sed -i '1,2d' fi ...

  7. 浪潮的CS5260F CS5260H CS5260Z

    助力国产操作系统新生态!麒麟信安与东方通.浪潮.新华三.长城超云等多家生态伙伴完成产品兼容性认证 作者:湖南麒麟信安科技股份有限公司时间:2022-03-11 16:28:11 我要发布 关键词: 国 ...

  8. SingleNode HDFS 搭建过程

    背景 1. 纯粹测试 2. 未考虑安全和授权以及数据处理. 3. 单节点最简单的部署, 验证功能连接的可能性 资料获取以及环境变量的设置 获取最新的安装文件 https://downloads.apa ...

  9. 日志框架简介-Slf4j+Logback入门实践 | 京东云技术团队

    前言 随着互联网和大数据的迅猛发展,分布式日志系统和日志分析系统已广泛应用,几乎所有应用程序都使用各种日志框架记录程序运行信息.因此,作为工程师,了解主流的日志记录框架非常重要.虽然应用程序的运行结果 ...

  10. (数据科学学习手札113)Python+Dash快速web应用开发——表单控件篇(下)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 由我开源的先进Dash组件库feffery-antd-co ...