调用接口处理数据时点击取消让接口停止并让数据回滚多线程实现Thread

根据线程名停止线程工具类

public class ThreadUtils {
	 public static boolean killThreadByName(String name) {
        ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
        int noThreads = currentGroup.activeCount();
        Thread[] lstThreads = new Thread[noThreads];
        currentGroup.enumerate(lstThreads);
        System.out.println("现有线程数" + noThreads);
        for (int i = 0; i < noThreads; i++) {
            String nm = lstThreads[i].getName();
            System.out.println("线程号:" + i + " = " + nm);
            if (nm.equals(name)) {
                lstThreads[i].stop();
                return true;
            }
        }

        return false;

    }
}

接口

public interface TestService {
    void save();
}

实现类

@Service
public class TestServiceImpl implements TestService {

    @Autowired
    private ZhenggaiInfoTblMapper zhenggaiInfoTblMapper;

    @Override
    @Transactional(rollbackFor=RuntimeException.class)
    public void save() {
        for (int i = 0; i < 100000; i++) {
            ZhenggaiInfoTbl zhenggaiInfoTbl = new ZhenggaiInfoTbl();
            zhenggaiInfoTbl.setRowguid(CommUtils.getUUID());
            zhenggaiInfoTbl.setZgjcguid("测试");
            zhenggaiInfoTbl.setIssubmit("测试");
            zhenggaiInfoTbl.setZgfktime(new Date());
            zhenggaiInfoTbl.setZgfkunit("测试");
            zhenggaiInfoTblMapper.insert(zhenggaiInfoTbl);
            System.out.println("插入:"+i);
            /*if(i==20000){
                System.out.println(1/0);
            }*/

        }
    }
}

控制器

@RestController
public class TestController {


    @Autowired
    private TestService testService;

    @GetMapping("testThread")
    public void test(String name) {
        Thread thread = new Thread(() -> {
            testService.save();
        });
        thread.setName(name);
        thread.start();
    }

    @GetMapping("testStop")
    public void testStop(String name) {
        ThreadUtils .killThreadByName(name);
    }
}

在调用接口时传一个随机参数就是线程名
在线程正在运行时,调用停止线程接口传入之前的线程名(也就是取消操作)
此时接口报错数据就会回滚了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个使用 CyclicBarrier 控制多线程事务回滚的示例代码: ```java import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class TransactionRollbackDemo { private static final int THREAD_COUNT = 3; private static CyclicBarrier cyclicBarrier = new CyclicBarrier(THREAD_COUNT, new Runnable() { @Override public void run() { System.out.println("All threads have arrived, starting to rollback..."); // TODO: 执行回滚操作 } }); public static void main(String[] args) { for (int i = 0; i < THREAD_COUNT; i++) { new Thread(new Worker(i)).start(); } } static class Worker implements Runnable { private int workerId; public Worker(int workerId) { this.workerId = workerId; } @Override public void run() { try { System.out.println("Worker " + workerId + " is working..."); Thread.sleep(1000); System.out.println("Worker " + workerId + " has finished working, waiting for others..."); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } } ``` 上面的代码中,我们创建了一个 CyclicBarrier 对象,设置了等待的线程数量为 3,并且在所有线程都到达屏障点执行一个回调函数来执行回滚操作。 然后我们创建了 3 个 Worker 线程,并且在每个线程中执行一些任务,然后通过调用 cyclicBarrier.await() 方法来等待其他线程到达屏障点。 当所有线程都到达屏障点,CyclicBarrier 会执行回调函数来执行回滚操作。 注意,上面的示例代码中,回滚操作只是一个 TODO 注释,需要根据具体的业务场景来实现具体的回滚逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值