线程管理(十一)处理线程组内的不受控制异常

简介:

处理线程组内不受控制异常

对于编程语言来说,一个非常重要的事情是提供管理应用出错情况的机制。Java 语言, 作为最现代的编程语言,实现except基于异常的机制来管理出错情况,它提供很多种类来表示不同的错误。当检测到一个异常状况时,这些异常会被Java类们抛出。你也可以使用这些异常, 或者实现你自己的异常, 来管理你的类产生的错误。

Java 也提供机制来捕捉和处理这些异常 。有些一定要被捕捉或者使用方法的throws句组再抛出,这些异常称为检查异常(checked exceptions)。有些异常不需要被捕捉,这些称为未检查异常(unchecked exceptions)。

在这个指南中,你将学习了如何使用通用方法来处理线程对象抛出的所有未捕获的异常

另一种可能是创建一个方法,捕获所有被ThreadGroup类的任何线程抛出的非捕捉异常。

在这个指南中, 我们将用例子来学习如何设置处理程序。

准备

指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。

怎么做呢

按照这些步骤来实现下面的例子::

1.   首先, 创建一个类叫MyThreadGroup来扩展 ThreadGroup 类 。我们必须声明一个拥有一个参数的构造方法,因为ThreadGroup类有一个没有参数的构造方法。


1 public class MyThreadGroup extends ThreadGroup {
2 public MyThreadGroup(String name) {
3 super(name);
4 }

2.   覆盖 uncaughtException() 方法。ThreadGroup 类的其中一个线程抛出异常时,就会调用此方法 。在这里,这个方法会把异常和抛出它的线程的信息写入操控台并中断ThreadGroup类的其余线程。


2 public void uncaughtException(Thread t, Throwable e) {
3 System.out.printf("The thread %s has thrown an Exception\n",t.getId());
4 e.printStackTrace(System.out);
5 System.out.printf("Terminating the rest of the Threads\n");
6 interrupt();
7 }

3.   创建一个类,名为 Task, 并一定要实现Runnable 接口。


1 public class Task implements Runnable {

4.   实现run()方法。在这里,我们将会抛出一个 AritmethicException 异常。这样,我们要用1000除以一个随机数字,直到随机生成的数为0的时候,异常就会被抛出。


01 @Override
02 public void run() {
03 int result;
04 Random random=new Random(Thread.currentThread().getId());
05 while (true) {
06 result=1000/((int)(random.nextDouble()*1000));
07 System.out.printf("%s : f\n",Thread.currentThread().getId(),result);
08 if (Thread.currentThread().isInterrupted()) {
09 System.out.printf("%d : Interrupted\n",Thread.currentThread().getId());
10 return;
11 }
12 }
13 }

5.   现在,我们来实现例子的主类通过实现一个Main类和实现一个main() 方法.


1 public class Main {
2 public static void main(String[] args) {

6.   创建一个 MyThreadGroup 类对象。


1 MyThreadGroup threadGroup=new MyThreadGroup("MyThreadGroup");

7.   创建一个 Task 类对象.


1 Task task=new Task();

8.   创建 2个 Thread 对象与这个 Task 并开始他们。


1 for (int i=0; i<2; i++){
2 Thread t=new Thread(threadGroup,task);
3 t.start();
4 }

9.   运行例子并查看结果。

它是怎么工作的

当运行这个例子,你会发现线程对象是如何抛出异常和其他被中断的。当一个非捕捉异常在线程内抛出,JVM会为这个异常寻找3种可能handlers。

首先, 它寻找这个未捕捉的线程对象的异常handle,如在线程中处理不受控制异常中介绍的,如果这个handle 不存在,那么JVM会在线程对象的ThreadGroup里寻找非捕捉异常的handler,如我们在这个指南中学习的。如果此方法不存在,那么 JVM 会寻找默认非捕捉异常handle如果没有 handlers存在, 那么 JVM会把异常的 stack trace 写入控制台并结束任务。

目录
相关文章
|
4月前
|
安全 Java 开发者
丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案
丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案
74 0
|
7天前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
37 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
17天前
|
监控 Java
线程池中线程异常后:销毁还是复用?技术深度剖析
在并发编程中,线程池作为一种高效利用系统资源的工具,被广泛用于处理大量并发任务。然而,当线程池中的线程在执行任务时遇到异常,如何妥善处理这些异常线程成为了一个值得深入探讨的话题。本文将围绕“线程池中线程异常后:销毁还是复用?”这一主题,分享一些实践经验和理论思考。
30 3
|
28天前
|
Java 数据库连接 数据库
当线程中发生异常时的情况分析
【8月更文挑战第22天】
60 4
|
24天前
|
Java
线程池中线程抛了异常,该如何处理?
【8月更文挑战第27天】在Java多线程编程中,线程池(ThreadPool)是一种常用的并发处理工具,它能够有效地管理线程的生命周期,提高资源利用率,并简化并发编程的复杂性。然而,当线程池中的线程在执行任务时抛出异常,如果不妥善处理,这些异常可能会导致程序出现未预料的行为,甚至崩溃。因此,了解并掌握线程池异常处理机制至关重要。
101 0
|
27天前
|
缓存 开发框架 NoSQL
【Azure Redis 缓存】Azure Redis 异常 - 因线程池Busy而产生的Timeout异常问题
【Azure Redis 缓存】Azure Redis 异常 - 因线程池Busy而产生的Timeout异常问题
|
1月前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
28 0
|
4月前
|
运维 负载均衡 Java
nacos常见问题之单机nacos2.2.3线程池异常如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
4月前
|
C++
C++多线程场景中的变量提前释放导致栈内存异常
C++多线程场景中的变量提前释放导致栈内存异常
49 0