[英]What does the JVM do in background before calling Thread.run()? OR Why Thread.run() isn't exposed to the user?
當程序員調用Thread.start()
時,JVM會調用線程的run方法。
在調用Thread.run()
之前,JVM在后台做了什么?
為什么Thread.run()
沒有向用戶公開?
在調用
Thread.run()
之前,JVM在后台做了什么?
它使JVM能夠管理線程對象(分配堆棧空間,線程本地,...)以及分支和調度新線程/進程/克隆或架構用於實現線程的任何架構的每架構本機工作。
為什么
Thread.run()
沒有向用戶公開?
我假設你在談論堆棧框架的“暴露”。 就像靜態main
方法一樣,顯然在用戶代碼之上的調用框架沒有向用戶公開,因為它們沒用,而且會讓人感到困惑。 我會對Thread.run()
方法說同樣的話。 如果擴展Thread
並覆蓋run()
, 它將顯示在調用堆棧中,但如果傳入目標Runnable
則不會顯示 。
我在這個答案中有很多關於此的細節:
在調用Thread.run()之前,JVM在后台做了什么?
當你調用start()時,它啟動一個與Thread
對象相關聯的線程,該Thread
調用Thread
的run()方法。
注意:創建,啟動和調度線程的所有工作都由操作系統完成。 Java只是進行正確的系統調用。 實際工作不是JVM代碼。
或者為什么Thread.run()沒有向用戶公開?
暴露了。 它是公共的,你可以像任何其他方法一樣調用它。
當您通過thread.run()開始時,您將其作為正常進程運行,而不是真正將其用作線程。 它將與主線程連接。 使用thread.start(),JVM分配不與主線程連接的單獨線程。
當您調用start()
, Thread
類實際上創建了新的JVM線程(與調用線程分開),並從該新線程調用run()
。
創建新的JVM線程,以便應用程序代碼可以具有多個運行代碼的線程,這是一種低級JVM操作。
如果run()
被暴露給用戶,並且它被調用而不是start()
,那么run()
的代碼將在單個調用線程中串行執行。
someThread.start()
調用一個本機方法,告訴JVM創建一個新線程。 例如,熱點的血腥細節可以在源代碼中找到。
實質上, start()
要求os創建一個新線程,然后在新創建的線程中調用Thread#run()
方法。
您開始深入研究JVM本身的實現,因為啟動新線程需要與操作系統進行交互。 這是JVM中線程的一個非常好的中級解釋 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.