周五在java群里看到了一个有意思的问题,周末就顺便实现了一下,需求如下:

考察一个多线程的场景,一个Http?Request的controller有10个线程同时并行处理,要求:

1)?主线程必须等待10个线程全部执行成功后主线程返回“Success”

2)?只要其中任意一个线程出错,不仅当前出错的线程要回滚,其他所有线程不管成功失败也要回滚,主线程等待所有线程回滚完毕后输出相应的错误字符“Fail”。?

代码如下:

package com.mfunny.queue;

import java.util.concurrent.BlockingDeque;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.LinkedBlockingDeque;

/**

*

*

*

*

*

*

* 修改历史: <br>

* 修改日期 修改人员 版本 修改内容

* --------------------------------------------------------------------

* 2016年03月26日 上午9:31 1.0 初始化创建

*

*

* @author

* @version 1.0

* @since JDK1.7

*/

public class Test {

private static class Rollback {

public Rollback(Boolean needRoolBack) {

this.needRoolBack = needRoolBack;

}

private Boolean needRoolBack = false;

public Boolean getNeedRoolBack() {

return needRoolBack;

}

public void setNeedRoolBack(Boolean needRoolBack) {

this.needRoolBack = needRoolBack;

}

}

private static class Task implements Runnable {

/**

* 监控10个子任务的执行

*/

private CountDownLatch childMonitor;

/**

* 监控主线程

*/

private CountDownLatch mainMonitor;

/**

* 存储线程的返回结果

*/

private BlockingDeque resultList;

/**

* 回滚类

*/

private Rollback rollback;

public Task(CountDownLatch childCountDown, CountDownLatch mainCountDown, BlockingDeque result, Rollback rollback) {

this.childMonitor = childCountDown;

this.mainMonitor = mainCountDown;

this.resultList = result;

this.rollback = rollback;

}

private void shouldRollBack() {

System.out.println(Thread.currentThread().getName()+"开始回滚");

}

/**

* 事务提交

*/

private void submit() {

}

/**

* 执行任务,返回false表示任务执行错误,需要回滚

* 本案例中根据线程名字包含Thread-8判断是否回滚

* @return

*/

private Boolean processTask() {

if(Thread.currentThread().getName().contains("Thread-8"))

return false;

return true;

}

@Override public void run() {

System.out.println(Thread.currentThread().getName()+"子线程开始执行任务");

Boolean result = processTask();

//向队列中添加处理结果

resultList.add(result);

//等待其他的子线程执行完成,一起执行主线程的判断逻辑

childMonitor.countDown();

try {

//等待主线程的判断逻辑执行完,执行下面的是否回滚逻辑

mainMonitor.await();

} catch (Exception e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"子线程执行剩下的任务");

//需要回滚

if (rollback.getNeedRoolBack())

shouldRollBack();

else

//不需要回滚->事务提交

submit();

}

}

public static void main(String[] args) {

//监控10个子线程的任务执行

CountDownLatch childMonitor = new CountDownLatch(10);

//监控主线程,是否需要回滚

CountDownLatch mainMonitor = new CountDownLatch(1);

//存储任务的返回结果,返回true表示不需要回滚,反之,则回滚

BlockingDeque results = new LinkedBlockingDeque(10);

Rollback rollback = new Rollback(false);

for (int i = 0; i < 10; i++) {

//10个任务启动

Thread thread = new Thread(new Task(childMonitor, mainMonitor, results, rollback));

thread.start();

}

try {

//监测10个子线程的执行

childMonitor.await();

System.out.println("主线程开始执行任务");

//根据返回结果来确定是否回滚

for (int i = 0; i < 10; i++) {

Boolean result = results.take();

if (!result) {

rollback.setNeedRoolBack(true);

}

}

//10个子线程开始执行

mainMonitor.countDown();

if(rollback.getNeedRoolBack())

System.out.println("Fail");

else System.out.println("Success");

} catch (Exception e) {

}

}

}

?思想就是使用两个CountDownWatch实现子线程的二段提交

?

顺便给群打一下广告:

java高级群(329019348)

java水群(51317874)

原文:http://lsk569937453.iteye.com/blog/2286415

java 多线程回滚,多线程事务回滚相关推荐

  1. oracle计算回滚时间,事务回滚时间估算

    事务回滚时间估算 1. 当Oracle处于open 状态,当Oracle回滚事务的时候,可以从used_urec,used_ublk数值可以初步估计Oracle回滚事务 的速度. SQL> se ...

  2. Java后端之数据库操作事务回滚

    什么是事物 事物是应用程序中一系列操作,事物完成是指所有的操作都完成,事物不完成是指一个操作也不能完成,事物结束有两种情况,当事务中的所有步骤全部完成时,事务提交,如果一个步骤失败,则发生回滚操作,撤 ...

  3. 什么是事务和事务回滚?

    数据库理解事务: 为什么要有事务? 事务应用于各种场景,订单系统.银行系统 例如: 小明去某银行取钱,首先有以下几个步骤: 银行卡放入ATM机.,输入密码 连接数据库,验证账户密码 验证成功,获得用户 ...

  4. 数据库事务与事务回滚

    目录 1.什么是事务? 2.事务的特性(ACID) 3.并发事务带来的问题 4.事务隔离级别 5.什么是回滚? 6.什么是事务回滚? 7.如何进行事务回滚 1.什么是事务? 事务是逻辑上的一组操作,要 ...

  5. 一套超好用的“Excel导入导出+多线程处理导入数据+多线程事务回滚”的模板方法

    一.模板流程: 二.功能演示: 1.Excel数据: 数据说明:第一条数据完整,可以成功导入:第二条数据无姓名,业务逻辑姓名不允许为空,会导出到错误Excel中:第三条数据无姓名无类型,业务逻辑姓名类 ...

  6. java 单元测试_在springboot中写单元测试解决依赖注入和执行后事务回滚问题

    往期文章 「Java并发编程」谈谈Java中的内存模型JMM 面试官:说说你知道多少种线程池拒绝策略 为什么不要在MySQL中使用UTF-8编码方式 前言 很多公司都有写单元测试的硬性要求,在提交代码 ...

  7. java jdbc 回滚_java_详解Java的JDBC API中事务的提交和回滚,如果JDBC连接是在自动提交模式 - phpStudy...

    详解Java的JDBC API中事务的提交和回滚 如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关 ...

  8. java的oracle事务回滚_Oracle事务处理

    二.事务和锁 当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户修改表的结构.这里对我们的用户来讲是非常重要的. 三.提交事务 当用commit语句执行时可以提交事务.当执 ...

  9. java 事务 回滚

    给java后台方法添加事务回滚注解,在方法进行多表的增删改查的时候,如果失败可以对此方法前面的一些更新数据库表的语句进行撤销(回滚) 注解:@Transactional(rollbackFor = E ...

  10. java事务什么时候回滚_spring事务什么时候会自动回滚

    在java中异常的基类为Throwable,他有两个子类xception与Errors.同时RuntimeException就是Exception的子类,只有RuntimeException才会进行回 ...

最新文章

  1. OSChina 周二乱弹 ——在影楼工作的妹子,可追不?
  2. android 注册、登录实现程序
  3. 设计模式学习笔记二:简单工厂模式
  4. python3.5安装scrapy_win10下基于python3.5安装scrapy教程
  5. Jm86中的encode_one_macroblock注释
  6. 过磅系统_简讯:崇义商砼公司开展无人值守过磅系统业务培训等二则
  7. 干货| 掌握这种逻辑思维,大厂面试成功率可提升90%
  8. oracle认证视频教程,Oracle认证专家视频教程-OCP全套教程之学习笔记-RMAN-CATALOG
  9. JSP中常用的字体类型
  10. odb对象关系映射系统
  11. A/B Test(AB测试) 流程、常见面试问题及解答
  12. html css blockquote,css之blockquote美化
  13. 焦作大学计算机专业分数线,焦作大学历年分数线 2021焦作大学录取分数线
  14. 截图工具当前未在计算机上运行 请重启_一个顶十个的工具箱软件,这才是真正的装机必备。...
  15. Formality使用总结1
  16. 程序员进阶攻略-笔记-041~050
  17. 手淘Android容器架构——Atlas的前世今生
  18. WebStorm快捷键(附官方pdf)
  19. Java 并发专题 CyclicBarrier 打造一个安全的门禁系统
  20. Wonderware-InTouch脚本程序、字符串拆分

热门文章

  1. js建立excel表格_建立Excel足球联赛表格传统方法与动态数组
  2. C#TCP多线程通信
  3. 行人检测-LUV颜色空间
  4. 如何用C语言实现圈叉游戏(-)
  5. 正则表达式总结,正则表达式匹配不包含某个字符串
  6. 《自私的基因》与博弈论
  7. 【先楫HPM6750系列】RT-Thread SPI驱动和WiFi联网
  8. spring boot 单元测试的使用和一些坑
  9. 认识自我是人生的高峰
  10. vue实现文字过长鼠标移上去显示对应文字,移走隐藏