2013-02-19 26 views

回答

3

此方法會導致當前線程進入休眠狀態,但它如何知道哪個線程是當前線程?

電流線程由底層操作系統(或穿線系統)管理。底層(依賴於系統)線程執行提供了一個手柄到當前線程:

  • POSIX線程情況下,存在該API調用pthread_self()它返回當前正在執行的線程的線程ID。你可以想象最終調用這個C函數的Thread.currentThread()並將線程ID包裝在Java對象中,然後返回。

  • MS窗口的情況下,存在API調用GetCurrentThread(),其返回當前正在執行的線程的Windows句柄。再次,您可以考慮最終調用此C函數並將句柄包裝在返回的Java Thread對象中。

+0

問題仍然是相同的 - 如何做'currentThread()'如果它工作靜態和屬於類,而不是具體的'線程'對象? – Lies 2013-02-19 08:40:06

+0

*有一個具體的Thread對象(意味着與該線程相關的數據),但它由操作系統(或線程系統)管理。通過靜態方法,您基本上可以獲得相應「當前」線程的Java包裝。 – 2013-02-19 08:49:46

+0

很好的答案,謝謝!但是,請支持提問者關注編輯,我看到您的編輯已經太遲以至於無法接受 – Lies 2013-02-19 08:58:53

3

native方法是特殊的。他們可以訪問Java API之外的內容。

在這種情況下,向當前線程。你不能使用這個方法來讓另一個線程進入休眠狀態 - 另一個線程本身必須執行此操作(但顯然,你可以發送一條消息給它)。

+0

每次有人對我說:「它超出了Java API,不要觸摸它」。謝謝,我忘了檢查Java源代碼。 – Lies 2013-02-19 08:47:09

+1

它不超越Java API。它實際上**並未在Java **中實現,而是在骯髒,雜亂,高度優化的C代碼中實現。我並沒有試圖說「遠離這個」,但我試圖說「不要嘗試將Java規則應用於這種方法,它不是Java」。 – 2013-02-19 08:53:37

0

該方法總是針對當前執行的線程進行調用。

0

這意味着您當前的線程將進入睡眠模式一段非常短的時間。例如:如果我將寫入Thread.sleep(1000)線程將進入睡眠狀態1000毫秒。 我們主要使用這個小節來介紹這個線程之間的交換。總之,它會給另一個執行線程提供機會。

+0

查看評論@Sudhanshu Umalkar回答 – Lies 2013-02-19 08:45:03

0

當前線程是實際執行該代碼段的線程。就如此容易。

例如:

public static void main(String[] args) { 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Before sleeping!"); 
      Thread.sleep(10000); 
      System.out.println("After sleeping!"); 
     } 
    } 
    Thread t1 = new Thread(r); 
    Thread t2 = new Thread(r); 
    System.out.println("Main thread!"); 
} 

可輸出類似:

Before sleeping! // t1 
Main thread!  // main 
Before sleeping! // t2 
After sleeping! // t1 
After sleeping! // t2 
+0

它是否提供了我的問題的答案? – Lies 2013-02-19 08:44:18