@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());
    }
posted @ 2026-04-13 09:32  yub4by  阅读(25)  评论(0)    收藏  举报