2013-03-08 89 views
7

我想如下運行具有斷點下面的代碼:的IntelliJ - 沒有停止對多線程代碼中的所有斷點

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

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

運行此代碼時只有I ++斷點被擊中......如果我刪除那一個,另一個線程的斷點將被正確命中。爲什麼這種奇怪的行爲發生?

回答

6

這是記錄在http://www.jetbrains.com/idea/webhelp/breakpoints-2.html

有某些情況時的IntelliJ IDEA不會在斷點處停止。考慮以下情況: 在一個類的不同方法中設置了兩個斷點,並將暫掛策略設置爲全部。 當其中一個斷點被擊中時,會執行一些步驟操作。 如果在步進另一個線程時遇到第二個斷點,IntelliJ IDEA不會停在那裏。

我複製了您的代碼示例並重新創建了情況。 果然,就像它在文檔中說的那樣,在停止在i++斷點處後,如果我按F8(跳過),程序不會停在另一個斷點上。但是如果我打F9(恢復)程序確實再次停在另一個斷點上。

+0

我個人認爲這是一個競賽條件。在我的情況*恢復*仍然**沒有**觸發新線程的斷點。解決問題的唯一方法是在開始新線程之前不要分手。然後這一切正常。 – kervin 2015-07-30 01:45:44

+0

是否將斷點上的暫停策略設置爲「全部」(而不是「線索」)? – 2015-07-30 11:33:03

+0

是的,他們都是。我可以簡單地通過將斷點從線程起點移近或更遠來觸發該問題,以便單獨確認某種競爭條件。 – kervin 2015-07-30 12:34:27

0

因爲另一個線程是計劃的要在後臺運行,並且當OS線程調度程序決定運行它時,它將運行。當你有一個斷點時,它會被擊中。

當你只是運行代碼時,它不會一定開始,因此立即命中i++處的斷點。

+0

斷點從未被擊中...主線程完成執行,我可以看到打印的「Starting」字符串,所以行已經執行,但沒有發生斷點 – Bober02 2013-03-08 16:50:18

+0

@ Bober02也許你的調試器不會執行多線程調試? – 2013-03-08 16:52:25

0

我剛剛遇到了這個問題,並且爲了其他人遇到這個問題,下面是此行爲的原因以及如何更改它。

正如Doron指出的,有關於此的文件。但是,要注意的是,默認情況下,當達到斷點時,JVM中的所有線程都會掛起。

你所期望的(以及我期望的)是隻有帶斷點的線程被掛起。

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

改變這種行爲(並提供所需的行爲)。

1)通過左鍵單擊邊距創建斷點。
2)按ctrl + shift + F8(調出斷點菜單)。
3)選擇你的斷點。你會看到它的選項。
4)確保選中了「Suspend」並選擇了「Thread」無線電選項。
5)單擊「設爲默認值」按鈕。

現在,當您運行時,您會看到不同線程中的斷點被擊中。