为什么 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()
线程应该继续执行并打印所有控制台输出。但实际上,两个线程中的执行都停止了,没有任何打印。
是不是因为天性
- Java?
- IntelliJ?
- 处理器?
- OS?
我在 Macbook Pro 上使用 2.2 GHz Quad-Core Intel Core i7
处理器。
为什么会这样?
这是因为这是 IntelliJ 的行为。如果你有一个断点,右键单击它,它会显示以下弹出窗口:
在 Suspend
下,您会看到如果到达该断点,所有线程都会停止。您还可以选择仅停止当前线程。
我正在尝试一个简单的代码片段来检查 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()
线程应该继续执行并打印所有控制台输出。但实际上,两个线程中的执行都停止了,没有任何打印。
是不是因为天性
- Java?
- IntelliJ?
- 处理器?
- OS?
我在 Macbook Pro 上使用 2.2 GHz Quad-Core Intel Core i7
处理器。
为什么会这样?
这是因为这是 IntelliJ 的行为。如果你有一个断点,右键单击它,它会显示以下弹出窗口:
在 Suspend
下,您会看到如果到达该断点,所有线程都会停止。您还可以选择仅停止当前线程。