java多线程:线程体往外抛出异常的处理机制实践

简介: 1当线程的线程体内部无捕获异常,将异常抛出线程体外,不同情况下,程序处理机制测试类 1 package com.ehking.bankchannel.domesticremit.facade.impl; 2 3 import java.

1当线程的线程体内部无捕获异常,将异常抛出线程体外,不同情况下,程序处理机制

测试类

 1 package com.ehking.bankchannel.domesticremit.facade.impl;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.concurrent.Executor;
 6 import java.util.concurrent.Executors;
 7 
 8 
 9 public class ThreadTest {
10 
11     private static Executor executor=Executors.newCachedThreadPool();
12     
13     
14     public static void main(String[] args) {
15         test01();
16         //test02();
17     }
18     
19     /**
20      * 线程池,主线程往线程池提交任务(子线程)
21      * 如果任务中有往外抛出异常,主线程并不会捕获异常。
22      * 是线程池捕获了任务的异常
23      */
24     public static void test02(){
25         
26         ThreadTask aTask=new ThreadTask(1);
27         ThreadTask aTask2=new ThreadTask(2);
28         ThreadTask aTask3=new ThreadTask(6);
29         List<ThreadTask> aList=new ArrayList<ThreadTask>();
30         aList.add(aTask);
31         aList.add(aTask2);
32         aList.add(aTask3);
33         try {
34             for(ThreadTask a:aList){
35                 executor.execute(a);
36             }
37             System.out.println("ThreadTest.test02(没有执行)");
38         } catch (Exception e) {
39             System.out.println("ThreadTest.test02()"+e);
40         }
41         
42         
43     }
44     /**
45      * 如果用匿名线程,匿名线程中有抛出异常,无捕获的话,主线程是会捕获这个异常
46      */
47     public static  void test01(){
48         System.out.println("ThreadTest.test01()==>主线程运行开始");
49         final List<String> list=new ArrayList<String>();
50         try {
51             list.add("sxf");
52             list.add("chn");
53             
54             Thread thread=new Thread(new Runnable() {
55                 
56                 @Override
57                 public void run() {
58                     System.out
59                             .println("ThreadTest.test01().new Runnable() {...}.run()子线程加爱");
60                     list.add("love");
61                     System.out
62                             .println("ThreadTest.test01().new Runnable() {...}.run()子线程抛出异常");
63                     int a=3/0;
64                     System.out
65                             .println("ThreadTest.test01().new Runnable() {...}.run()z县城结束");
66                 }
67             });
68             thread.start();
69             
70             
71         } catch (Exception e) {
72             System.out.println("ThreadTest.test01()子线程抛出异常"+e);
73         }
74         
75         try {
76             Thread.sleep(3000L);
77         } catch (InterruptedException e) {
78             // TODO Auto-generated catch block
79             e.printStackTrace();
80         }
81         for(String aString:list){
82             System.out.println("ThreadTest.test01()打印==>"+aString);
83         }
84         System.out.println("ThreadTest.test01()==>主线程运行结束");
85     }
86 }
View Code

 线程类

 1 package com.ehking.bankchannel.domesticremit.facade.impl;
 2 
 3 public class ThreadTask implements Runnable{
 4 
 5     private int a;
 6     
 7     public ThreadTask(int a){
 8         this.a=a;
 9     }
10     
11     @Override
12     public void run() {
13         if(a%2==0){
14             System.out.println("ThreadTask.run()【"+a+"】运行正常.......");
15         }else{
16             System.out.println("ThreadTask.run()【"+a+"】抛出异常");
17             int s=2/0;
18         }
19         
20     }
21 
22     
23 }
View Code

 

相关文章
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
135 0
|
4月前
|
人工智能 Java 关系型数据库
Java——SPI机制详解
SPI(Service Provider Interface)是JDK内置的服务提供发现机制,主要用于框架扩展和组件替换。通过在`META-INF/services/`目录下定义接口实现类文件,Java程序可利用`ServiceLoader`动态加载服务实现。SPI核心思想是解耦,允许不同厂商为同一接口提供多种实现,如`java.sql.Driver`的MySQL与PostgreSQL实现。然而,SPI存在缺陷:需遍历所有实现并实例化,可能造成资源浪费;获取实现类方式不够灵活;多线程使用时存在安全问题。尽管如此,SPI仍是Java生态系统中实现插件化和模块化设计的重要工具。
152 0
|
2月前
|
人工智能 前端开发 安全
Java开发不可不知的秘密:类加载器实现机制
类加载器是Java中负责动态加载类到JVM的组件,理解其工作原理对开发复杂应用至关重要。本文详解类加载过程、双亲委派模型及常见类加载器,并介绍自定义类加载器的实现与应用场景。
179 4
|
3月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
|
3月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
231 5
|
3月前
|
监控 搜索推荐 Java
Java 多线程最新实操技术与应用场景全解析:从基础到进阶
本文深入探讨了Java多线程的现代并发编程技术,涵盖Java 8+新特性,如CompletableFuture异步处理、Stream并行流操作,以及Reactive编程中的Reactor框架。通过具体代码示例,讲解了异步任务组合、并行流优化及响应式编程的核心概念(Flux与Mono)。同时对比了同步、CompletableFuture和Reactor三种实现方式的性能,并总结了最佳实践,帮助开发者构建高效、扩展性强的应用。资源地址:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
244 3
|
4月前
|
算法 Java 调度
Java多线程基础
本文主要讲解多线程相关知识,分为两部分。第一部分涵盖多线程概念(并发与并行、进程与线程)、Java程序运行原理(JVM启动多线程特性)、实现多线程的两种方式(继承Thread类与实现Runnable接口)及其区别。第二部分涉及线程同步(同步锁的应用场景与代码示例)及线程间通信(wait()与notify()方法的使用)。通过多个Demo代码实例,深入浅出地解析多线程的核心知识点,帮助读者掌握其实现与应用技巧。
|
4月前
|
人工智能 JavaScript Java
Java反射机制及原理
本文介绍了Java反射机制的基本概念、使用方法及其原理。反射在实际项目中比代理更常用,掌握它可以提升编程能力并理解框架设计原理。文章详细讲解了获取Class对象的四种方式:对象.getClass()、类.class、Class.forName()和类加载器.loadClass(),并分析了Class.forName()与ClassLoader的区别。此外,还探讨了通过Class对象进行实例化、获取方法和字段等操作的具体实现。最后从JVM类加载机制角度解析了Class对象的本质及其与类和实例的关系,帮助读者深入理解Java反射的工作原理。
101 0
|
4月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
186 0
|
7月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
130 26