2012-05-30 118 views
1

當我嘗試調試多線程程序時,遇到了一個新問題。下面,我列出了一個測試程序,演示了我的問題。實質上,當我在調用線程的start()方法以及該線程的run()方法時放置一個斷點時,如果在調試器中「繼續」,事情就沒有問題。但是,如果我繼續,我可以逐步調用start(),println()和join(),之後程序將等待執行完成,但這種情況從未發生過。線程似乎不會執行,並且我的斷點在線程的run()中不會跳閘。我必須退出程序。掛上線程運行()帶斷點

現在,如果run()中沒有斷點,我繼續還是繼續都沒有關係;該線程執行。我在這裏錯過了什麼?

請注意,我使用的是香草eclipse調試。

public class Test { 
    public static void main(String[] args) { 
     try { 
      Thread myThread = new Test().new TestThread(); 
      long threadStartTime = System.currentTimeMillis(); 
      myThread.start(); // **********Breakpoint 1 
      System.out.println("Thread started"); 
      myThread.join(); 
      long threadExecutionTime = System.currentTimeMillis() - threadStartTime; 
      System.out.println("Thread finished execution in " + threadExecutionTime + " milliseconds."); 
     } catch(InterruptedException e) { 
      System.err.println(e.getMessage()); 
     } 
    } 

    private class TestThread extends Thread { 
     @Override 
     public void run() { // **********Breakpoint 2 
      try { 
       sleep(5*1000); 
      } catch(InterruptedException e) { 
       System.err.println(e.getMessage()); 
      } 
     } 
    } 
} 

回答

3

您確定run()中的斷點未被觸發嗎?在Eclipse中,您需要單擊第二個線程才能看到它已暫停。我懷疑該線程已經啓動,但正在等待你說繼續。

我懷疑如果在run()中沒有斷點,那麼跨過start()就可以正常工作。這是第二個斷點,它阻止另一個線程並阻止其運行sleep()或返回到join()

在下圖中,您可以看到我跨過了start()方法並啓動了Thread-1。但它暫停(見黃色暫停欄)等待您切換到並繼續。

enter image description here

+0

恰到好處。謝謝你們! – Walker

2

如果您使用eclipse進行調試,您應該在調試窗口中看到線程列表。從那裏選擇另一個線程的堆棧跟蹤,您也應該能夠調試運行方法。