package com.test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
public class Test {
private static ExecutorService exec = Executors.newCachedThreadPool();
public static void main(String[] args) throws InterruptedException, ExecutionException {
CountDownLatch mainThreadCount = new CountDownLatch(10);
CountDownLatch rollBackCount = new CountDownLatch(1);
AtomicBoolean rollbackFlag = new AtomicBoolean(false);
for (int i = 0; i < 10; i++) {
exec.execute(new TaskWithoutResult(i, mainThreadCount, rollBackCount, rollbackFlag));
}
// 主线程业务执行完毕 如果其他线程也执行完毕 且没有报异常 正在阻塞状态中 唤醒其他线程 提交所有的事务
// 如果其他线程或者主线程报错 则不会进入if 会触发回滚
if (!rollbackFlag.get()) {
mainThreadCount.await();
rollBackCount.countDown();
}
}
}
package com.test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
class TaskWithoutResult implements Runnable {
private int id;
private CountDownLatch mainThreadCount;
private CountDownLatch rollBackCount;
private AtomicBoolean rollbackFlag;
public TaskWithoutResult(int id, CountDownLatch cout, CountDownLatch rollBackCount, AtomicBoolean rollbackFlag) {
this.id = id;
this.mainThreadCount = cout;
this.rollBackCount = rollBackCount;
this.rollbackFlag = rollbackFlag;
}
@Override
public void run() {
if (rollbackFlag.get()) {
return;
}
try {
Thread.sleep(1000 * id);
if (id == 3) {
//int a = id / 0;
}
mainThreadCount.countDown();
rollBackCount.await();// 我执行完了,我等着看别人执行结果是不是有回滚
if (rollbackFlag.get()) {
System.out.println("线程" + id + "回滚事务");
// 回滚
} else {
// 提交我的事务
System.out.println("线程" + id + "提交事务");
}
} catch (Exception ex) {
// 如果出错了 就放开锁 让别的线程进入提交/回滚 本线程进行回滚
rollbackFlag.set(true);
rollBackCount.countDown();
mainThreadCount.countDown();
// 自己出错了要回滚自己
///////////
System.out.println("线程" + id + "回滚事务");
}
}
}