我正在尝试使用断点运行以下代码,如下所示:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Starting"); //breakpoint here
}
}).start();
int i = 10;
i++; //breakpoint here
当此代码仅运行时,i ++断点被触发...如果我删除了那个,那么另一个线程的断点将被正确命中。为什么会出现这种奇怪的行为?
答案 0 :(得分:6)
http://www.jetbrains.com/idea/webhelp/breakpoints-2.html中记录了这一点:
在某些情况下,IntelliJ IDEA不会在断点处停止。考虑以下情况: 在类的不同方法中设置两个断点,并将挂起策略设置为All。 当其中一个断点被击中时,执行一些步骤操作。 如果在步进另一个线程遇到第二个断点时,IntelliJ IDEA将不会停在那里。
我复制了你的代码示例并重新创建了这种情况。
果然,就像它在文档中说的那样,在i++
断点处停止后,如果我按下F8(跳过),程序就不会停在另一个断点上。但如果我点击F9(恢复),程序会再次停止在另一个断点上。
答案 1 :(得分:0)
因为另一个线程预定在后台运行,并且当OS线程调度程序决定运行它时,它将运行。如果你有一个断点,它就会被击中。
当您只运行代码时,它不会一定启动,因此i++
处的断点会立即被触发。
答案 2 :(得分:0)
我刚遇到这个问题,为了遇到其他问题,这就是造成这种行为的原因以及如何改变它。
Doron指出,有关于此的文件。但是,重要需要注意的是,默认情况下,当达到断点时,JVM中的所有线程都会被挂起。
您期望(以及我期待的)是只有具有断点的线程被暂停。
这不是你想要的,也不是我想要的。
更改此行为(并提供所需的行为)。
1)左键单击边距创建一个断点 2)按ctrl + shift + F8(调出断点菜单) 3)选择断点。你会看到它的选项 4)确保"暂停"检查并且"线程"选择了无线电选项 5)点击"默认"按钮。
现在,当你运行时,你会看到不同线程中的断点被击中。