例如方法public static void sleep(long millis)
。這種方法會導致當前線程進入休眠狀態,但它是如何知道的?哪個線程是最新的?靜態方法是獨立於對象的,屬於類,所以這個機制是如何工作的?java.lang.Thread靜態方法如何工作?
回答
此方法會導致當前線程進入休眠狀態,但它如何知道哪個線程是當前線程?
的電流線程由底層操作系統(或穿線系統)管理。底層(依賴於系統)線程執行提供了一個手柄到當前線程:
在POSIX線程情況下,存在該API調用pthread_self()它返回當前正在執行的線程的線程ID。你可以想象最終調用這個C函數的
Thread.currentThread()
並將線程ID包裝在Java對象中,然後返回。在MS窗口的情況下,存在API調用GetCurrentThread(),其返回當前正在執行的線程的Windows句柄。再次,您可以考慮最終調用此C函數並將句柄包裝在返回的Java
Thread
對象中。
native
方法是特殊的。他們可以訪問Java API之外的內容。
在這種情況下,向當前線程。你不能使用這個方法來讓另一個線程進入休眠狀態 - 另一個線程本身必須執行此操作(但顯然,你可以發送一條消息給它)。
每次有人對我說:「它超出了Java API,不要觸摸它」。謝謝,我忘了檢查Java源代碼。 – Lies 2013-02-19 08:47:09
它不超越Java API。它實際上**並未在Java **中實現,而是在骯髒,雜亂,高度優化的C代碼中實現。我並沒有試圖說「遠離這個」,但我試圖說「不要嘗試將Java規則應用於這種方法,它不是Java」。 – 2013-02-19 08:53:37
該方法總是針對當前執行的線程進行調用。
這意味着您當前的線程將進入睡眠模式一段非常短的時間。例如:如果我將寫入Thread.sleep(1000)線程將進入睡眠狀態1000毫秒。 我們主要使用這個小節來介紹這個線程之間的交換。總之,它會給另一個執行線程提供機會。
查看評論@Sudhanshu Umalkar回答 – Lies 2013-02-19 08:45:03
當前線程是實際執行該代碼段的線程。就如此容易。
例如:
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
它是否提供了我的問題的答案? – Lies 2013-02-19 08:44:18
- 1. 靜態和非靜態方法工作
- 2. 靜態方法的工作
- 3. 靜態方法工作
- 4. 如何使靜態工廠方法不是靜態實例?
- 5. django如何靜態工作
- 6. AutoMapper靜態工廠方法
- 7. 靜態工廠方法(Spring)
- 8. 靜態工廠方法
- 9. Autofac工廠靜態方法
- 10. 靜態工廠方法
- 11. 靜態工廠方法
- 12. 只有「靜態」的方法簽名是如何工作的?
- 13. 同步靜態方法在Java中如何工作?
- 14. 如何做靜態方法?
- 15. 如何在靜態方法
- 16. 如何在靜態方法
- 17. 如何從靜態方法輸入非靜態方法
- 18. 如何用非靜態方法覆蓋靜態方法?
- 19. 如何從靜態方法調用非靜態方法android
- 20. 如何從靜態方法調用非靜態方法
- 21. 如何從靜態方法調用非靜態方法?
- 22. 如何從一個靜態方法調用非靜態方法
- 23. 如何從靜態方法調用非靜態方法?
- 24. 如何在靜態方法中訪問靜態和非靜態方法
- 25. Html.RenderAction作爲靜態方法
- 26. 靜態靜態方法?
- 27. 靜態工廠方法vs工廠
- 28. 靜態方法
- 29. 靜態方法
- 30. 靜態方法
@Downvoter,評論你的行動,請 – Lies 2013-02-19 11:57:38