標籤:width 不能 為什麼 main函數 過程 記憶體 概念 研究 增強
一.
我們關注的重點在於主線程,我們一般不關注記憶體回收,因為這個動作是自動的,它是以什麼方式來判斷的呢?堆記憶體中一旦產生垃圾,它是不會立即去清理的,如果立即去清理的話會降低效率。因為記憶體回收在操作時,會和主線程搶奪cpu的控制權(擷取cpu的執行權)。在某一時刻誰拿到執行權,誰就操作。接下來就是什麼時候回收的呢?它會先判斷堆記憶體的空間大小,如果滿足一定的量就要進行釋放了。不釋放就裝不進去了,怕溢出,就要做自動釋放動作。
接下來用執行個體代碼來體現,(體現什嗎?)
只考慮主線程部分,
這裡DOS編譯啟動並執行結果都是主線程式控制制執行的。
現在畫一下多線程的圖,(不在畫堆了,直接對著棧研究),這裡的記憶體配置圖相較於以前的記憶體配置圖有了很大的增強。(這複雜的過程一直存在,以前沒有介紹)
並不是說沒有堆記憶體的產生,而是我們現在的重點在棧記憶體上。
棧記憶體畫好後,裡面就有主線程(虛擬機器啟動的時候,告訴大家要執行這個類,是不是先要啟動一條線程,它其實啟動多條線程,其中有一條是負責主函數的),所以這條線程啟動完了以後,就來了一個叫做main函數,(線程是在程式碼運行之前啟動的,因為它要控制整個運行流程。)
其實這裡面有條路徑,(這玩意兒怎麼畫呢?)無所謂了,反正執行過程是一樣的。當我們在main裡面建立兩個對象,注意建構函式我是不畫(首先堆記憶體沒畫,裡面的對象也沒畫。對象建立時的構造是要在棧記憶體中畫的,現在也省略了。)當我們d調用show的時候,show就進棧了,show進棧還是依賴主線程,(有可能構造器進棧都是依賴主線程)
(對圖解進行了修改,棧記憶體中不應該從上往下畫執行路徑,看著好像是從上往下執行,應該是程式碼從上往下執行)
首先是主線程先進棧(主線程為什麼會有進棧的概念?),緊跟著show方法就進棧了。這就要執行show去了,show沒執行完,能執行到主函數嗎?是不可能的。
這個show一執行完就出棧了,出棧後,主函數繼續執行。執行的是d2.show,這時show方法再次進棧,執行完以後,再次出棧。之後,有一個return,執行後主函數出棧了。這個時候,已經沒有可執行內容了,主線程就結束了(貌似主線程對應的就是主函數裡面的代碼),主線程一結束,沒有內容的情況下,虛擬機器把這個進程就關閉了,(我們不說底層的內容,那是虛擬機器自動掌管的)
現在我們有一個這樣的擔心,出現這樣的問題該怎麼解決呢?比如說,當我們的程式在向下啟動並執行過程中,遇到了一個圈(如所示),話句話說,它是一個迴圈,它要迴圈好多次。一旦轉起來,下面就無法執行了。這就意味著下面的代碼運行不到,我們想要運行到。不想因為這個迴圈在這,耽誤時間,怎麼辦?
這個時候,我們就有可能要單獨搞一條執行路徑。來負責這段內容的執行。
左邊是主線程,右邊是自己建立的線程,或者說自己定義的線程,那麼有這個迴圈情況嗎?現在示範的看一下,
(修改了程式,來示範一下)
整個DOS的結果是慢慢地往外蹦。
現在我的需求是什麼樣的呢?正因為有程式不斷地在圈那兒停止,不斷地去運行,而不往下走,導致我這程式比較慢。那麼,我們就想說,能不能實現“旺財”和xiaoqiang同時執行呢?這就是我們的需求,
如何能實現“旺財”和xiaoqiang同時執行,是不是需要做一個動作,xiaoqiang在一個路徑當中,旺財要執行的代碼在另外一個代碼當中,是不是就可以完成這個動作啦,cpu在兩個路徑上進行切換。該如何建立一條新的路徑呢?
JAVA-初步認識-第十二章-主線程運行樣本