2013-08-24 39 views
1

我想測試Thread.sleep()方法,並且我發現了一個有趣的事情..當我調用main()方法時,控制檯將打印出「UserA sleeping ...」和「用戶A喚醒...」,這意味着程序被喚醒,但是當我使用junit方法運行與main()方法相同的代碼時,它不會打印出「UserA wake ...」... I將不勝感激任何人都可以解釋它。爲什麼不能喚醒這個線程

package com.lmh.threadlocal; 

import org.junit.Test; 

public class ThreadTest { 

    public static void main(String [] args) { 
     new Thread(new UserA()).start(); 
    } 
    @Test 
    public void testWakeup(){ 
     new Thread(new UserA()).start(); 
    } 

} 

class UserA implements Runnable{ 
    @Override 
    public void run() { 
     try { 
      System.out.println("UserA sleeping..."); 
      Thread.sleep(1000); 
      System.out.println("UserA waking..."); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
+2

「醒來傑夫!!」 –

+0

您可以在'testWakeup'的開始和結束處添加更多調試語句。就像,在開始 - 「產生一個新線程」。 – bsd

+0

但爲什麼調用main()方法不需要喚醒? – Crowley

回答

2

我的猜測是JUnit在睡眠結束之前正在拆除測試,因爲測試執行線程在睡眠結束之前退出測試方法。嘗試

@Test 
public void testWakeup() throws Exception { 
    Thread t = new Thread(new UserA()); 
    t.start(); 
    t.join(); 
} 
+0

我認爲你是對的,它的工作。謝謝:) – Crowley

+0

如果線程不是守護線程,它也應該打印,我是對嗎? – jamee

+0

這個答案並沒有真正解釋爲什麼「拆卸」停止了第二個println的發生...... –