@Async中替代Thread.sleep的正确写法
//@Async+Thread.sleep()=线程池杀手,会直接毁掉异步线程池的性能。(本地调试可以临时用,生产环境严禁出现)
//原因:线程池里的线程是复用的,不是无限创建。用sleep()会让线程空占着不干活,阻塞整个线程池。
//结果:线程池很快被占满,新的异步任务全部排队或卡住。服务吞吐量暴跌,甚至引发任务堆积或超时。
//解决:类@Autowired private ThreadPoolTaskScheduler taskScheduler;方法taskScheduler.schedule(()->{业务逻辑}, new Date(System.currentTimeMillis()+延迟时间毫秒));
//不阻塞@Async线程,等待期间线程直接放回线程池,延迟靠调度器ThreadPoolTaskScheduler实现,零资源浪费,生产环境安全。
/**
* @description:
* @param: [futureList, course]
* @return: void
* @date: 2025/12/2 13:55
* @author: yhf
**/
@Async("threadPoolTaskExecutor")
public void updateCourseAIGraphAssociationState(List<Future<String>> futureList, PlatformCourse course) {
log.info("updateCourseAIGraphAssociationState()==>子线程开启:" + Thread.currentThread().getName());
if (CollectionUtils.isEmpty(futureList) || course == null) {
log.info("updateCourseAIGraphAssociationState()==>参数缺失");
log.info("updateCourseAIGraphAssociationState()==>子线程结束:" + Thread.currentThread().getName());
return;
}
log.info("updateCourseAIGraphAssociationState()==>当前课程id: {},name:{}", course.getId(), course.getcName());
/*
try {
Thread.sleep(1000*10);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
boolean allDone = true;
for (Future<String> future : futureList) {
//如果任务已经完成,无论是因为正常结束、发生异常还是被取消,isDone()方法都会返回true。如果任务尚未完成,则返回false
if (future.isDone() == false) {
allDone = false;
break; //跳出for:存在未执行完成的线程
}
}
if (allDone) {
break; //跳出while:所有线程全部执行完成
}
}
course.setAiGraphAssociationState(2);
courseService.updateCourse(course);
*/
taskScheduler.schedule( () -> {
while (true) {
boolean allDone = true;
for (Future<String> future : futureList) {
//如果任务已经完成,无论是因为正常结束、发生异常还是被取消,isDone()方法都会返回true。如果任务尚未完成,则返回false
if (future.isDone() == false) {
allDone = false;
break; //跳出for:存在未执行完成的线程
}
}
if (allDone) {
break; //跳出while:所有线程全部执行完成
}
}
course.setAiGraphAssociationState(2);
courseService.updateCourse(course);
}, new Date(System.currentTimeMillis()+1000*10) ); //延迟10秒后再执行{}
log.info("updateCourseAIGraphAssociationState()==>子线程结束:" + Thread.currentThread().getName());
}

浙公网安备 33010602011771号