為啥我用IDEA測試多線程,一直是先運行main()方法中的代碼?然後才會執行多線程?

柔沢十


看到你這個問題,忍不住點進來了,可能你剛剛入門這個程序猿這個行業,我雖然是科班出身,但你知道現在大學生活是太豐富了,學習總是排在最後一位的,導致的結果就是畢業時找工作四處碰壁,所以那時我才算開始系統的研究我這門學科,這個行業吧,怎麼說呢,培訓速成是可以上手的,但是我覺得還是需要一些基礎知識支撐的,比如計算機組成原理、微機原理、彙編語言、編譯原理、操作系統、軟件工程、面向對象方法、計算機網絡、當然還包括類似離散數學、統計學等課程,這些都算是這個行業的基本課程。

額,不好意思,好像扯的有點遠了,下面我先回答下你的問題:

如果你想搞懂你的這個問題,你需要先搞明白2個概念,進程是什麼、線程又是什麼,他們的關係是什麼,又是如何工作的。

進程:

這個概念我就按書上寫的來了:進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。

這個解釋好像有點糊弄事的意思,其實說的簡單點就是,我們操作系統調度的單位,就比如我們啟動的IDEA在操作系統裡面就是一個進程,我們經常使用的tomcat,啟動後也是一個進程,他們在一次啟動後在操作系統裡都有唯一的進程id,我們經常說的強制關閉某個軟件,其實就是殺死這個進程。

進程的5態模型

線程:

線程是一條執行路徑,是程序執行時的最小單位,它是進程的一個執行流,是CPU調度和分派的基本單位,一個進程可以由很多個線程組成,線程間共享進程的所有資源,每個線程有自己的堆棧和局部變量。線程由CPU獨立調度執行,在多CPU環境下就允許多個線程同時運行。同樣多線程也可以實現併發操作,每個請求分配一個線程來處理。


進程與線程的關係:

  • 一個程序就是一個進程,而一個程序中的多個任務則被稱為線程。進程是表示資源分配的基本單位,又是調度運行的基本單位,亦即執行處理機調度的基本單位。
  • 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。線程是操作系統可識別的最小執行和調度單位。
  • 資源分配給進程,同一進程的所有線程共享該進程的所有資源。同一進程中的多個線程共享代碼段(代碼和常量),數據段(全局變量和靜態變量),擴展段(堆存儲)。但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量,即每個線程都有自己的堆棧和局部變量。
  • 線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。

結合你的疑問解釋:

你的疑問是為什麼會先走main方法,其實我覺得這可以理解為一個傳統,java作為之後的語言,對之前的語言的一種致敬。按照程序運行的機制,一個程序的執行必然是由另一個更之前的程序去啟動的 最原始的就到了操作系統。說白了main方法就是jvm默認找尋的方法(解釋起來比較多,設計到彙編指令,c語言的設計等等,你就可以這麼理解java是c語言寫的,c語言裡面使用的聲明main方法的方式作為入口,java自然也是這樣,說的更通俗一點就是編譯器的源碼中把main標記成程序執行的入口),擦我覺得我說的好像不是人話了。

就是說你在IDEA中點擊run跑起來的程序就是一個進程,這個進程的入口方法就是mian方法,你所說的多線程是你啟動的這個進程中的單元,當然會在mian方法後面執行。


好了,不寫了,我也不知道自己在寫什麼了,其實知道一些,但又寫不出來,可能還是一知半解吧,希望能對你的疑問有點幫助吧。


唯一胡小然


main函數是你程序的入口,沒有開大門怎麼再開其他門呢?

線程

線程(Thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。

同一進程中的多條線程將共享該進程中的全部系統資源,如虛擬地址空間,文件描述符和信號處理等等。但同一進程中的多個線程有各自的調用棧(call stack),自己的寄存器環境(register context),自己的線程本地存儲(thread-local storage)。

Java多線程

多線程編程的目的,就是“最大限度地利用CPU資源”,當某一線程的處理不需要佔用CPU而只和I/O等資源打交道時,讓需要佔用CPU資源的其他線程有機會獲得CPU資源。

Java中如果我們自己沒有產生線程,系統會自動產生一個線程,該線程為主線程(main)。因為它是程序開始時就執行的。主線程的重要性體現在兩方面:

  1. 它是產生其他子線程的線程;
  2. 通常它必須最後完成執行,因為它執行各種關閉動作。


分享到:


相關文章: