记录一下idea的多线程debug

步骤 1:设置断点策略为 "All"

  1. 右键点击断点(红点)

  2. 选择 More 或 Ctrl+Shift+F8 打开断点设置

  3. 在 Suspend 下拉框中选择:All(默认是 Thread

    默认:Suspend = Thread  → 只暂停当前线程
    改成:Suspend = All     → 暂停所有线程

image

步骤 2:在主线程和异步线程的代码上打断点

多线程需要交互的数据位置,也就是主线程到异步线程的进出点和异步线程的开始点。例如:
@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 面板中:

  1. 点击 Frames 标签下方的下拉框(显示当前线程名)

  2. 可以看到所有暂停的线程:

    • main(主线程)

    • pool-1-thread-1(异步线程)

  3. 点击切换,就能看到不同线程的调用栈和变量

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

好了,剩下的就靠自己点击去一点一点测,找切换到哪个线程才能测试到想要的数据。

记录一下以防遗忘。。。

 

posted @ 2026-07-22 00:50  曦灰  阅读(5)  评论(0)    收藏  举报