首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >子线程如何等待主线程执行完再执行

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

作者头像
程序猿川子
发布于 2025-05-06 15:33:22
发布于 2025-05-06 15:33:22
7090
举报

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

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

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

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

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

代码语言:javascript
复制
csharp 代码解读复制代码public interface EndExec <T>{

    void exec(T  t);
}
代码语言:javascript
复制
csharp 代码解读复制代码public interface EndExecList<T> {

    void exec(List<T> list);
}
代码语言:javascript
复制
scss 代码解读复制代码/**
 * 线程执行于父线程结束后 工具
 */
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);
        });
    }

}
代码语言:javascript
复制
bash 代码解读复制代码ThreadEndExec.exec((u)->{
            ...
},user);

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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档