@PostMapping("/generate")
public BaseResponse<GenerateChartResponse> generateChartByAI(...) {
// ...
// 🔴 断点 1:主线程 - 提交异步任务前
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 🔴 断点 2:异步线程 - 异步任务内部
String chartReturn = chartService.chat(prompString.toString());
// ...
}, threadPoolExecutor);
// 🔴 断点 3:主线程 - 等待异步任务完成
future.get(30, TimeUnit.SECONDS);
return ResultUtils.success(generateChartResponse);
}
步骤 3:调试时切换线程
当程序暂停时,在 Debug 面板中:
-
点击 Frames 标签下方的下拉框(显示当前线程名)
-
可以看到所有暂停的线程:
-
main(主线程)
-
pool-1-thread-1(异步线程)
-
点击切换,就能看到不同线程的调用栈和变量
![image]()
↑↓面是切换到主线程,其中↑是断点1,
![image]()
![image]()
↑是我们在断点1和断点2都打上的情况下,可以查到的线程,其中http-nio-exec-6这个是断点1,下面的线程1点开一个是这样的:
![image]()
![image]()
切换到线程1,执行后直接进入futureTask的断点了:
![image]()
断点1往下按F7执行一步,按tab选择lambda表达式的{},按回车选中lambda表达式中的内容,就会进入主线程的futureTask,继续按F7下一步才会在lambda表达式中的断点2停:
![image]()
查看其他线程:下拉框找到我们自定义命名的线程:线程1:
![image]()
![image]()
好了,剩下的就靠自己点击去一点一点测,找切换到哪个线程才能测试到想要的数据。
记录一下以防遗忘。。。