前言
在开发过程中,各位是否有遇到一下场景。
当前方法(主方法)执行完成之后,需要调用其他系统接口、new一个新线程执行其他业务、调用第三方系统api。
但此时因为“主方法”未提交事务,其他接口系统、线程 无法拿到数据
1、思路
有没有办法判断当前线程执行完成之后,再次发起调用子业务处理?
1、有的,获取当前线程,
2、通过循环,获取线程状态,当 线程状态=“TERMINATED”的时候,说明主方法已经结算,这时就可以继续当前子业务的进行
2、实现
2.1、获取线程
// 利用 Thread.currentThread() 获取当前状态
Thread thread = Thread.currentThread();
2.2、工具类
@Slf4j
public class ThreadUtils {
/**
* 监听指定线程是否已经执行完毕或者销毁
* @param waitNum 监听次数
* @param sleepTime 每次监听间隔时长
* @param thread 监听的线程
*/
public static void threadWait(int waitNum, long sleepTime, Thread thread) {
for (int i = 0; i < waitNum; i++) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
State state = thread.getState();
if ("WAITING".equals(state.name()) || "TERMINATED".equals(state.name())) {
log.info("程序已完成【{}】:{}",i+1, state);
return;
} else {
log.debug("等待【{}】:{}",i+1, state);
}
}
}
}
2.3、实战
public static void main(String[] args) {
Thread thread = Thread.currentThread();
new Thread(()->{
ThreadUtils.threadWait(20,200,thread);
log.info("主线程已经结算");
}).start();
try {
// 模拟接口处理中
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("我是主线程:已经执行完成");
}
2.3、效果
3、总结
通过监听线程的状态判断主业务是否完成,然后调用子线程的逻辑,并且是两段独立代码,双方互不影响