10

我正在尝试使用以下断点运行以下代码:

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Starting"); //breakpoint here
        }
    }).start();

    int i = 10;
    i++; //breakpoint here

当此代码仅运行时 i++ 断点被命中...如果我删除那个,另一个线程的断点将被正确命中。为什么会出现这种奇怪的行为?

4

3 回答 3

10

这记录在http://www.jetbrains.com/idea/webhelp/breakpoints-2.html中:

在某些情况下,IntelliJ IDEA 不会在断点处停止。考虑以下情况:在一个类的不同方法处设置两个断点,并且将挂起策略设置为全部。当某个断点被命中时,会执行一些单步操作。如果在单步执行另一个线程时遇到第二个断点,IntelliJ IDEA 不会停在那里。

我复制了您的代码示例并重新创建了这种情况。果然,就像文档中所说的那样,在i++断点处停止后,如果我按 F8(跳过),程序不会在另一个断点处停止。但是,如果我按 F9(恢复),程序确实会在另一个断点处再次停止。

于 2013-08-22T08:51:11.193 回答
3

我刚刚遇到了这个问题,为了其他遇到这个问题的人,这里是这种行为的原因以及如何改变它。

正如 Doron 指出的那样,有关于此的文档。但是,需要注意的重要一点是,默认情况下,当到达断点时,JVM 中的所有线程都会暂停。

您所期待的(以及我所期待的)是只有带有断点的线程被挂起。

这不是你想要的,也不是我想要的。

更改此行为(并提供所需的行为)。

1)左键单击边距创建断点。
2) 按 ctrl+shift+F8(调出断点菜单)。
3)选择你的断点。您将看到它的选项。
4) 确保选中“暂停”并选择“线程”单选选项。
5) 单击“设为默认值”按钮。

Now, when you run, you'll see that breakpoints in different threads are hit.

于 2015-06-27T07:48:31.600 回答
0

因为另一个线程被调度在后台运行,当 OS 线程调度器决定运行它时,它就会运行。当您确实有一个断点时,它将被击中。

当您只运行代码时,它不一定会启动,因此i++会立即命中断点。

于 2013-03-08T16:30:37.980 回答