簡體   English   中英

在調用Thread.run()之前,JVM在后台做了什么?或者為什么Thread.run()沒有向用戶公開?

[英]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方法。

  1. 在調用Thread.run()之前,JVM在后台做了什么?

  2. 為什么Thread.run()沒有向用戶公開?

在調用Thread.run()之前,JVM在后台做了什么?

它使JVM能夠管理線程對象(分配堆棧空間,線程本地,...)以及分支和調度新線程/進程/克隆或架構用於實現線程的任何架構的每架構本機工作。

為什么Thread.run()沒有向用戶公開?

我假設你在談論堆棧框架的“暴露”。 就像靜態main方法一樣,顯然在用戶代碼之上的調用框架沒有向用戶公開,因為它們沒用,而且會讓人感到困惑。 我會對Thread.run()方法說同樣的話。 如果擴展Thread並覆蓋run()它將顯示在調用堆棧中,但如果傳入目標Runnable 則不會顯示

我在這個答案中有很多關於此的細節:

Java run()方法如何工作?

在調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM