一个没什么用的IntelliJ IDEA调试多线程的小知识

起因

今天在 SpringBoot 中写了一段这样的代码:

1
2
3
4
5
6
7
8
9
@PostConstruct
private void init() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Do something");
}
}).start();
}

启动时在 run() 方法中打了断点,发现居然影响了整个 Spring 项目的启动,直接导致启动暂停。

猜测

按照常规理解,new Thread() 中应该并不会影响到整个项目的正常启动。

猜测是由于编辑器,也就是 IntelliJ IDEA 调试的配置问题。

尝试

尝试在断点处右键,设置断点中断条件时,发现了线程选项:

如图,在 Suspend 选项中,默认选中的为 All,也就是只要有一个线程进入了 Debug 状态,其他所有的线程都会暂时中止。因此将选项修改为 Thread 即可。

可以查看官网教程:https://www.jetbrains.com/help/idea/using-breakpoints.html#breakpoint-properties

The following policies are available for the breakpoints that suspend program execution:

  • All: all threads are suspended when any of the threads hits the breakpoint.
  • Thread: only the thread which hits the breakpoint is suspended.

If you want a policy to be used as the default one, click the Make default button.