iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java多线程事务管理的实现
  • 823
分享到

Java多线程事务管理的实现

2024-04-02 19:04:59 823人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录实现多线程的三种方式一、继承Thread类二、实现Runnable接口三、实现Callable和Future接口多线程单条数据事务管理今天要讨论的是“Java实现多线程单条数据事

今天要讨论的是“Java实现多线程单条数据事务管理”,在此之前,顺便回顾一下实现多线程的几种方式

实现多线程的三种方式

一、继承Thread类

第一种方法是继承Thread类,重写run()方法


public class TestThread extends Thread {
  public void run() {
   System.out.println("继承Thread类,重写run方法");
  }
}

使用时,new一个实例,执行start()方法


TestThread testThread1 = new TestThread(); // 新建状态
TestThread testThread2 = new TestThread(); // 新建状态
testThread1.start(); // 就绪状态
testThread2.start(); // 就绪状态

何时执行取决于cpu调度

二、实现Runnable接口

因为Java“单继承、多实现”的特性,当我们已经继承了一个类的时候,则无法再继承Thread类,此时可以通过实现Runnable接口的方式,实现run()方法


public class TestThread extends FatherClass implements Runnable {
  public void run() {
   System.out.println("实现Runnable接口的方式,实现run方法");
  }
}

Thread类也是实现Runnable接口

使用时,需要首先实例化一个Thread,并传入自己的TestThread实例


TestThread testThread = new TestThread();
Thread thread = new Thread(testThread);
thread.start();

三、实现Callable和Future接口

该方法区别于前两种的特点是:能够获得线程处理的结果。因此该方式适用于需要对线程的结果进行处理的场景


class TestCallable implements Callable<Integer> {

    @Override
    public Integer call() {
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
            sum += i;
        }
        return sum;
    }
}

使用时,先创建TestCallable对象,然后使用FutureTask来包装MyCallable对象,再将FutureTask对象作为Thread对象的target创建新的线程,最后thread执行start()方法,线程进入就绪状态


Callable<Integer> testCallable = new TestCallable();                    // 创建TestCallable对象
FutureTask<Integer> futureTask = new FutureTask<Integer>(testCallable); // 使用FutureTask来包装MyCallable对象
Thread thread = new Thread(futureTask);                                 // FutureTask对象作为Thread对象的target创建新的线程
thread.start();

多线程单条数据事务管理

我们有时会遇到这样的场景:要对大批量的数据进行更新或插入操作,需要开启多线程来提高效率,又希望每个线程在的处理一批数据时,能够对其中每条数据进行处理的时,做到出错时实现单条数据回滚,而不是所有数回滚(所有数据回滚后续讨论)。先看代码:

根据以上多线程知识,我们先定义一个业务线程类如下:


public class TestTranstionalThread extends Thread {

    private List<BalBankDictEntity> balBankDictEntities;

    public TestTranstionalThread( List<BalBankDictEntity> balBankDictEntities){
        this.balBankDictEntities = balBankDictEntities;

    }

    @Override
    public void run() {

        log.info("线程{}开始",Thread.currentThread().getName());

        for (BalBankDictEntity balBankDictEntity : balBankDictEntities) {

            try{
                collBillDao.insOneBank(balBankDictEntity);
            }catch (BusiException e){
                log.error("{}回滚",balBankDictEntity.getBankId());
            }

        }

        log.info("线程{}结束",Thread.currentThread().getName());
    }
}

insOneBank()方法如下,注意的@Transactional注解的事务隔离等级为:REQUIRES_NEW,创建一个新的事务。


@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insOneBank(BalBankDictEntity balBankDictEntity){

    balBankDictMapper.insert(balBankDictEntity);

    
    if (Integer.parseInt(balBankDictEntity.getBankId().substring(2)) % 100 == 0){
        throw new BusiException("test");
    }
}

开启多线程进行业务处理,注意加上@Transactional注解


@Transactional
public void testTransactional(){

    
    List<BalBankDictEntity> balBankDictEntities = new ArrayList<>();
    for (int i = 0 ; i < 100000 ; i ++){
        BalBankDictEntity balBankDictEntity = new BalBankDictEntity();
        balBankDictEntity.setBankCode("BK" + i);
        balBankDictEntity.setBankId("ID" + i + "");
        balBankDictEntity.setBankName("N" + i + "N");
        balBankDictEntities.add(balBankDictEntity);
    }

    int totalNum = balBankDictEntities.size();
    log.info("totalNum" + totalNum);

    
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
    int dealNum = totalNum % 10 == 0 ? totalNum / 10 : totalNum / 10 + 1; // 计算每个线程处理的数量

    for (int i = 1; i <= 10 ; i++ ){
        List<BalBankDictEntity> balBankDictEntityList = splitDataList(balBankDictEntities,dealNum,10,i);  // 切割数据集实现数据隔离

        TestTranstionalThread testTranstional = new TestTranstionalThread(balBankDictEntityList);
        fixedThreadPool.execute(testTranstional);

    }
}

最终实现多个线程并发插入数据,有异常的数据的单独回滚,不影响整体

到此这篇关于Java多线程事务管理的实现的文章就介绍到这了,更多相关Java多线程事务管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java多线程事务管理的实现

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java多线程事务管理的实现
    目录实现多线程的三种方式一、继承Thread类二、实现Runnable接口三、实现Callable和Future接口多线程单条数据事务管理今天要讨论的是“Java实现多线程单条数据事...
    99+
    2024-04-02
  • Java中怎么实现多线程事务管理
    Java中怎么实现多线程事务管理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、继承Thread类第一种方法是继承Thread类,重写run()方法public ...
    99+
    2023-06-20
  • java多线程事务控制怎么实现
    在Java中,可以使用以下方法实现多线程事务控制:1. 使用synchronized关键字:将需要进行事务控制的代码块用synchr...
    99+
    2023-10-11
    java
  • java多线程实现交通灯管理系统
    本文实例为大家分享了java多线程实现交通灯管理系统的具体代码,供大家参考,具体内容如下 一. 项目要求 模拟实现十字路口的交通灯管理系统逻辑。详细需求例如以下: 1、异步随机生...
    99+
    2024-04-02
  • Java多线程CountDownLatch的实现
    介绍 CountDownLatch是一个同步辅助类,它允许一个或多个线程一直等待直到其他线程执行完毕才开始执行。 用给定的计数初始化CountDownLatch,其含义是要被等待执行...
    99+
    2024-04-02
  • Java如何实现多线程、线程同步
    这篇文章主要介绍了Java如何实现多线程、线程同步的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java如何实现多线程、线程同步文章都会有所收获,下面我们一起来看看吧。1 多线程1.1 进程进程:是正在运行的程...
    99+
    2023-06-30
  • 多线程编程中的线程管理策略
    线程管理策略 线程管理策略可以分为两类: 1. 用户级线程管理 协作式线程管理:线程自愿交出控制权,允许其他线程执行。依赖于线程的合作,可能会导致死锁。 抢占式线程管理:操作系统负责调度线程,强制执行时间片,防止死锁。 2. 内核级线...
    99+
    2024-04-02
  • Java多线程CyclicBarrier的实现代码
    介绍 CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续...
    99+
    2024-04-02
  • springboot-jta-atomikos多数据源事务管理实现
    目录背景源码地址项目目录结构 实现1.添加依赖 pom.xml2.配置数据库连接信息 application.properties3.创建多数据源 DBAtomikosCo...
    99+
    2024-04-02
  • Java中的多线程如何实现线程通信
    这篇文章将为大家详细讲解有关Java中的多线程如何实现线程通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java多线程中线程间的通信一、使用while方式来实现线程之间的通信packag...
    99+
    2023-05-31
    java 多线程 线程通信
  • Java实现多线程中的静态代理模式
    前言 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 简言之,代理模...
    99+
    2024-04-02
  • Java实现UDP多线程在线咨询
    本文实例为大家分享了Java实现UDP多线程在线咨询,供大家参考,具体内容如下 1.发送的线程 import java.io.BufferedReader; import jav...
    99+
    2024-04-02
  • Java—实现多线程程序 | 入门
      目录 一、前言 二、基本概念 进程  线程 三、Java多线程实现 java.lang.Thread类 获取线程名字及对象 获取main进程名 Thread currentThread() 四、线程优先级  设置优先级  一、前言 前...
    99+
    2023-09-07
    java 开发语言 Java多线程程序 多线程 Thread类
  • Java多线程事务回滚@Transactional失效处理方案
    目录背景介绍公用的类和方法示例事务不成功操作使用sqlSession控制手动提交事务 背景介绍 1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插...
    99+
    2022-11-13
    Java多线程事务回滚 Java @Transactional失效
  • Java实现多线程聊天室
    本文实例为大家分享了Java实现多线程聊天室的具体代码,供大家参考,具体内容如下 之前呢已经用单线程的方式来实现了聊天室,但其实它的功能并不齐全,下面用多线程来实现,功能会比单线程聊...
    99+
    2024-04-02
  • Java中多线程怎么实现
    这篇文章主要讲解了“Java中多线程怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中多线程怎么实现”吧!线程是一些可以并行的,独立的执行的代码.之前我编的程序都只能做一件事情...
    99+
    2023-06-03
  • java如何实现多线程Thread
    这篇文章将为大家详细讲解有关java如何实现多线程Thread,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。start()我们先来看看API中对于该方法的介绍:使该线程开始执行;Java 虚拟机调用该线程...
    99+
    2023-05-30
    java thread
  • Java多线程使用方式和实现原理
    本篇内容介绍了“Java多线程使用方式和实现原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java中的线程Java之父对线程的定义是:线...
    99+
    2023-06-02
  • Python怎么实现多线程的事件监控
    这篇文章主要介绍“Python怎么实现多线程的事件监控”,在日常操作中,相信很多人在Python怎么实现多线程的事件监控问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么实现多线程的事件监控”的疑...
    99+
    2023-06-15
  • 怎么实现JAVA 多线程的浅析
    这期内容当中小编将会给大家带来有关怎么实现JAVA 多线程的浅析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JAVA 的多线程浅析一、JAVA 语言的来源、及特点在这个高速信息的时代,商家们纷纷把信息、...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作