为什么 CompletableFuture 中的断点也会停止主线程中的执行?

Why does a breakpoint in CompletableFuture stops execution in Main thread as well?

我正在尝试一个简单的代码片段来检查 CompletableFuture 是否在单独的线程中工作。

class Scratch {
    public static void main(String[] args) {

        CompletableFuture.runAsync(() -> {
            // method call or code to be asynch.
            new Worker().work();
        });
        for (int i = 0; i < 100; i++) {
            System.out.println("Main : " + i);
        }
    }

    private static class Worker {
        public void work() {
            for (int i = 0; i < 100; i++) {
                System.out.println("Worker : " + i);
            }
        }
    }
}

从控制台输出看来,他们似乎是并行工作的

Worker : 0
Main : 0
Worker : 1
Main : 1
Worker : 2
Main : 2
Worker : 3
Main : 3
Worker : 4
Main : 4
Worker : 5
Main : 5
Worker : 6
Main : 6
Worker : 7
Main : 7
Worker : 8

以及更多行。

当我在 work() 方法中放置一个断点时,出现了混乱。理想情况下,一旦 work() 中的行被命中,CompletableFuture 线程中的执行就会停止,这意味着 main() 线程应该继续执行并打印所有控制台输出。但实际上,两个线程中的执行都停止了,没有任何打印。

是不是因为天性

  1. Java?
  2. IntelliJ?
  3. 处理器?
  4. OS?

我在 Macbook Pro 上使用 2.2 GHz Quad-Core Intel Core i7 处理器。

为什么会这样?

这是因为这是 IntelliJ 的行为。如果你有一个断点,右键单击它,它会显示以下弹出窗口:

Suspend 下,您会看到如果到达该断点,所有线程都会停止。您还可以选择仅停止当前线程。