返回顶部
首页 > 资讯 > 精选 >Java子线程任务异常和主线程事务回滚问题怎么解决
  • 186
分享到

Java子线程任务异常和主线程事务回滚问题怎么解决

2023-06-30 12:06:42 186人浏览 泡泡鱼
摘要

这篇文章主要介绍了Java子线程任务异常和主线程事务回滚问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java子线程任务异常和主线程事务回滚问题怎么解决文章都会有所收获,下面我们一起来看看吧。一、提

这篇文章主要介绍了Java子线程任务异常和主线程事务回滚问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java子线程任务异常和主线程事务回滚问题怎么解决文章都会有所收获,下面我们一起来看看吧。

Java子线程任务异常和主线程事务回滚问题怎么解决

一、提出问题

主线程向线程池提交了一个任务,如果执行这个任务过程中发生了异常,如何让主线程捕获到该异常并且进行事务的回滚

二、主线程与子线程

先来看看基础,下图体现了两种线程的运行方式,

  • 左侧的图,体现了主线程启动一个子线程之后,二者互不干扰独立运行,生死有命,从此你我是路人!

  • 右侧的图,体现了主线程启动一个子线程之后继续执行主线程程序逻辑,在某一节点通过阻塞的方式来获取子线程的执行结果。

Java子线程任务异常和主线程事务回滚问题怎么解决

对于上文中提出的问题,一定是第二种才能解决主线程能够捕获子线程执行过程中发生的异常。这里就不得不提一个面试题,实现线程的两个接口Callable与Runnable之间的区别:

public interface Callable<V> {    V call() throws Exception;}
public interface Runnable {    public abstract void run();}

可以看到call方法带返回值,run方法没有返回值。另外call方法可以抛出异常,run方法不可以。很明显,我们为了要捕获或得知子线程的运行结果,或者运行异常,都应该通过Callable接口来实现。

这里我们写一个ExpSubThread类(子线程异常模拟类),实现Callable接口,不做过多的动作,直接抛出一个空指针异常。

public class ExpSubThread implements Callable {    @Override    public Object call() throws Exception {        throw new NullPointerException();    }}

三、线程池

在面临线程任务时,通常我们会预先建立一个线程池,线程池是预先规划好的n个线程资源的集合。它的好处在于:

  • 执行任务时,不是新建一个线程,而是使用线程池内已有的线程资源。任务执行完成也不是销毁线程,而是将线程资源归还线程池。所以在一定程度上,节省了线程创建和销毁所消耗的资源,达到线程资源重复利用的目的。

  • 因为线程池创建的大小是有上限的,所以线程池还有另外的一个作用就是避免线程无限制的被创建,避免应用资源无限制的被占用导致的系统宕掉的问题。

常用的线程池有两种,一种是jdk自带的,一种是spring线程池,在Spring环境下后者常常被使用,二者大同小异。这里我们使用Spring api来构建一个线程池。

public ThreadPoolTaskExecutor getThreadPool(){        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        executor.setMaxPoolSize(100);  //线程池最大线程数        executor.setCorePoolSize(50);//线程池核心线程数        executor.setQueueCapacity(50);//任务队列的大小        executor.setThreadNamePrefix("test_"); //线程前缀名        executor.initialize(); //线程初始化        return executor;}

四、异常的捕获

下面是我写的一个测试用例,在这里它代表了主线程的程序执行流程

@Testvoid subThreadExceptionTest() {        try{            //新建子线程对象            ExpSubThread expSubThread = new ExpSubThread();            //构建线程池            ThreadPoolTaskExecutor executor = getThreadPool();            //提交子线程任务,submit方法            Future future = executor.submit(expSubThread);            //在这里可以做主线程的业务其他流程操作            //阻塞等待子线程的执行结果            Object obj = future.get();          }catch (Exception e){            e.printStackTrace();            //事务回滚        }}

这里需要注意的是使用submit方法提交子线程任务到线程池内执行。ThreadPoolTaskExecutor有两种执行线程任务的方法,一种是execute方法,一种是submit方法。

  • execute方法没有返回值,所以无法判断任务是否成功完成,对应的线程类实现Runnable接口。

  • submit方法有返回值,返回一个Future,对应的线程类实现Callable接口。

Java子线程任务异常和主线程事务回滚问题怎么解决

Future.get()方法达到了阻塞主线程的目的,从而可以判断子线程任务的执行结果,并且get方法可以抛出异常。

    V get() throws InterruptedException, ExecutionException;

下面这张图是上面的测试用例程序程序e.printStackTrace();的效果,从图中可以看到两个Exception异常,一个是我们在子线程任务中以模拟的方式主动抛出的空指针异常,另一个由于空指针引发的get方法抛出的ExecutionException。

Java子线程任务异常和主线程事务回滚问题怎么解决

五、事务的回滚

上文中大家已经看到我们通过

  • 线程类实现Callable接口,达到了获取线程返回值,或者异常抛出的目的。

  • submit可以提交线程任务到线程池,并且可以获得子线程执行结果的返回值Future。

  • Future的get()方法可以获取子线程执行信息,包括异常的抛出。

那么既然我们已经可以在主线程内感知或catch子线程的异常信息了,下一步主线程的事务回滚是不是就太简单了?

  • jdbc 就conn.rollback()实现事务的回滚

  • spring环境下使用@Transactional注解就可以了。

关于“Java子线程任务异常和主线程事务回滚问题怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java子线程任务异常和主线程事务回滚问题怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Java子线程任务异常和主线程事务回滚问题怎么解决

本文链接: https://lsjlt.com/news/328677.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java子线程任务异常和主线程事务回滚问题怎么解决
    这篇文章主要介绍了Java子线程任务异常和主线程事务回滚问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java子线程任务异常和主线程事务回滚问题怎么解决文章都会有所收获,下面我们一起来看看吧。一、提...
    99+
    2023-06-30
  • 详解Java子线程异常时主线程事务如何回滚
    一、提出问题 最近有一位朋友问了我这样一个问题,问题的截图如下: 这个问题问的相对比较笼统,我来稍微详细的描述下:主线程向线程池提交了一个任务,如果执行这个任务过程中发生了异常,...
    99+
    2024-04-02
  • 子线程任务发生异常时主线程事务回滚示例过程
    目录一、提出问题二、主线程与子线程三、线程池四、异常的捕获五、事务的回滚一、提出问题 最近有一位朋友问了我这样一个问题,问题的截图如下: 这个问题问的相对比较笼统,我来稍微详细的描...
    99+
    2024-04-02
  • java主线程捕获子线程异常如何解决
    Java主线程可以通过以下几种方式捕获子线程的异常: 使用try-catch语句块:在子线程的run()方法中,可以使用try-c...
    99+
    2023-10-27
    java
  • Spring事务回滚异常怎么解决
    当Spring事务回滚异常时,可以尝试以下解决方法: 检查代码逻辑:首先检查代码逻辑是否正确,是否在事务范围内执行了可能导致异常...
    99+
    2024-03-01
    Spring
  • java怎么使用多线程解决主线程提前结束问题
    这篇文章主要介绍“java怎么使用多线程解决主线程提前结束问题”,在日常操作中,相信很多人在java怎么使用多线程解决主线程提前结束问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么使用多线程解决...
    99+
    2023-07-05
  • Java多线程之线程安全问题怎么解决
    本篇内容主要讲解“Java多线程之线程安全问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程之线程安全问题怎么解决”吧!1.线程安全概述1.1什么是线程安全问题首先我们需要...
    99+
    2023-06-30
  • java线程池状态异常怎么解决
    当Java线程池出现状态异常时,可以尝试以下解决方法: 检查线程池是否关闭:使用`isShutdown()`方法检查线程池是否已...
    99+
    2023-10-25
    java
  • Java多线程死锁问题怎么解决
    解决Java多线程死锁问题的常用方法有以下几种:1. 避免使用多个锁:尽量减少使用多个锁来降低出现死锁的概率。2. 按照固定的顺序获...
    99+
    2023-09-22
    Java
  • java treemap线程安全问题怎么解决
    要解决Java TreeMap的线程安全问题,有以下几种方法:1. 使用Collections.synchronizedMap()方...
    99+
    2023-10-20
    java
  • Java SimpleDateFormat线程不安全问题怎么解决
    本篇内容主要讲解“Java SimpleDateFormat线程不安全问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java SimpleDateFormat线程...
    99+
    2023-07-05
  • 怎么使用Java多线程Future获取异步任务
    本篇内容主要讲解“怎么使用Java多线程Future获取异步任务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Java多线程Future获取异步任务”吧!Runnable的局限性在前文中...
    99+
    2023-07-05
  • java单例模式和线程安全问题怎么解决
    这篇文章主要介绍“java单例模式和线程安全问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java单例模式和线程安全问题怎么解决”文章能帮助大家解决问题。单例模式、多实例模式、和线程安全...
    99+
    2023-07-05
  • 云服务器经常掉线怎么解决问题
    一、服务器故障原因分析 服务器配置错误 服务器配置错误是导致云服务器经常掉线的一个主要原因。在服务器配置方面,可能会存在一些问题,例如硬件故障、软件冲突等。例如,硬件故障可能导致服务器内存不足、内存故障可能导致数据库连接失败、数据库故...
    99+
    2023-10-27
    解决问题 掉线 服务器
  • Java线程技术中的死锁问题怎么解决
    这篇文章主要介绍“Java线程技术中的死锁问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程技术中的死锁问题怎么解决”文章能帮助大家解决问题。我们知道,使用 synchroniz...
    99+
    2023-06-02
  • Java调用存储过程事务问题怎么解决
    在Java中调用存储过程时,可以使用JDBC提供的事务管理功能来解决事务问题。以下是解决事务问题的一般步骤:1. 创建数据库连接:使...
    99+
    2023-10-24
    Java
  • Java调度线程池ScheduledThreadPoolExecutor不执行问题怎么解决
    本篇内容主要讲解“Java调度线程池ScheduledThreadPoolExecutor不执行问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java调度线程池ScheduledTh...
    99+
    2023-07-05
  • java for循环内执行多线程问题怎么解决
    这篇文章主要介绍了java for循环内执行多线程问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java for循环内执行多线程问题怎么解决文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • Java多线程之常见锁策略与CAS中的ABA问题怎么解决
    本文小编为大家详细介绍“Java多线程之常见锁策略与CAS中的ABA问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java多线程之常见锁策略与CAS中的ABA问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-30
  • SpringBoot通过@Scheduled实现定时任务及单线程运行问题解决
    目录一、开启定时任务方法二、不同定时方式的解析1.fixedDelay和fixedRate,单位是毫秒,它们的区别就是:2.cron表达式:灵活三、实现定时任务四、解决定时任务单线程...
    99+
    2023-02-21
    springboot @scheduled实现定时任务 Springbootschedule单线程 springboot 定时任务
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作