子线程如何等待主线程执行完再执行

      工作中由于需求不断迭代,导致业务变得越来越复杂,一些奇怪却又合理的代码逻辑就出现了。

      比如我们需要在一个巨大的业务逻辑方法中需要临时执行一些特殊的业务逻辑,但是这部分逻辑对主线程的执行结果不影响,那么我们就需要开一个子线程执行。假设子线程执行的部分业务是需要依赖主线程执行的结果(数据库的数据)的话,就必须要保证执行子线程的时候,主线程已经执行完毕(提交了事务)。

     那么如果保证呢,我具体想了两种方式

     第一种:通过spring的事务传播机制来实现,比如把主方法拆分成两个方法。第一个方法用来实现业务的主要逻辑,第二个方法用来处理特殊的操作,第一个方法上我们单独开一个事务(propagation = Propagation.REQUIRES_NEW),再执行第二个方法时第一个方法事务已经提交,这样就很好的解决了这一问题。

     第二种:考虑到复杂系统的代码维护难度,对代码改动过大的话可能会产生不可预测的严重后果,老板可能就不介意对现有的方法做拆分,在这种情况下如何保证主方法已执行完呢。下面是我写的一个折中的方案,基本上能满足需求。

public interface EndExec <T>{

    void exec(T  t);
}
public interface EndExecList<T> {

    void exec(List<T> list);
}

/**
 * 线程执行于父线程结束后 工具
 */
public class ThreadEndExec {

    public static<T> void exec(EndExec<T> exec, T  t){
        Thread thread = Thread.currentThread();
        CommonUtils.getThreadPoolExecutor().execute(()->{
            int second = 0;
            while(!Arrays.asList(Thread.State.WAITING,Thread.State.TERMINATED).contains(thread.getState())
                && second < 15){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                second = second + 1;
            }
            exec.exec(t);
        });
    }

    public static<T> void execList(EndExecList<T> exec,List<T> list){
        Thread thread = Thread.currentThread();
        CommonUtils.getThreadPoolExecutor().execute(()->{
            int second = 0;
            while(!Arrays.asList(Thread.State.WAITING,Thread.State.TERMINATED).contains(thread.getState())
                   && second < 15){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                second = second + 1;
            }
            exec.exec(list);
        });
    }

}
ThreadEndExec.exec((u)->{
            ...
},user);

上面是通过获取父线程的线程状态来判断父线程是否已经执行完成,然后再保守等待15秒的时间

暂时没有想到有什么更好的方法,有更好的方法欢迎留言学习

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值