為啥我用IDEA測試多線程?
看到你這個問題,忍不住點進來了,可能你剛剛?cè)腴T這個程序猿這個行業(yè),我雖然是科班出身,但你知道現(xiàn)在大學(xué)生活是太豐富了,學(xué)習(xí)總是排在最后一位的,導(dǎo)致的結(jié)果就是畢業(yè)時找工作四處碰壁,所以那時我才算開始系統(tǒng)的研究我這門學(xué)科,這個行業(yè)吧,怎么說呢,培訓(xùn)速成是可以上手的,但是我覺得還是需要一些基礎(chǔ)知識支撐的,比如計算機組成原理、微機原理、匯編語言、編譯原理、操作系統(tǒng)、軟件工程、面向?qū)ο蠓椒ā⒂嬎銠C網(wǎng)絡(luò)、當(dāng)然還包括類似離散數(shù)學(xué)、統(tǒng)計學(xué)等課程,這些都算是這個行業(yè)的基本課程。
額,不好意思,好像扯的有點遠了,下面我先回答下你的問題:
如果你想搞懂你的這個問題,你需要先搞明白2個概念,進程是什么、線程又是什么,他們的關(guān)系是什么,又是如何工作的。
進程:
這個概念我就按書上寫的來了:進程(Process)是計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。在早期面向進程設(shè)計的計算機結(jié)構(gòu)中,進程是程序的基本執(zhí)行實體;在當(dāng)代面向線程設(shè)計的計算機結(jié)構(gòu)中,進程是線程的容器。程序是指令、數(shù)據(jù)及其組織形式的描述,進程是程序的實體。
這個解釋好像有點糊弄事的意思,其實說的簡單點就是,我們操作系統(tǒng)調(diào)度的單位,就比如我們啟動的IDEA在操作系統(tǒng)里面就是一個進程,我們經(jīng)常使用的tomcat,啟動后也是一個進程,他們在一次啟動后在操作系統(tǒng)里都有唯一的進程id,我們經(jīng)常說的強制關(guān)閉某個軟件,其實就是殺死這個進程。
進程的5態(tài)模型
線程:
線程是一條執(zhí)行路徑,是程序執(zhí)行時的最小單位,它是進程的一個執(zhí)行流,是CPU調(diào)度和分派的基本單位,一個進程可以由很多個線程組成,線程間共享進程的所有資源,每個線程有自己的堆棧和局部變量。線程由CPU獨立調(diào)度執(zhí)行,在多CPU環(huán)境下就允許多個線程同時運行。同樣多線程也可以實現(xiàn)并發(fā)操作,每個請求分配一個線程來處理。
進程與線程的關(guān)系:
一個程序就是一個進程,而一個程序中的多個任務(wù)則被稱為線程。進程是表示資源分配的基本單位,又是調(diào)度運行的基本單位,亦即執(zhí)行處理機調(diào)度的基本單位。一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。線程是操作系統(tǒng)可識別的最小執(zhí)行和調(diào)度單位。資源分配給進程,同一進程的所有線程共享該進程的所有資源。同一進程中的多個線程共享代碼段(代碼和常量),數(shù)據(jù)段(全局變量和靜態(tài)變量),擴展段(堆存儲)。但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量,即每個線程都有自己的堆棧和局部變量。 線程在執(zhí)行過程中,需要協(xié)作同步。不同進程的線程間要利用消息通信的辦法實現(xiàn)同步。結(jié)合你的疑問解釋:
你的疑問是為什么會先走main方法,其實我覺得這可以理解為一個傳統(tǒng),java作為之后的語言,對之前的語言的一種致敬。按照程序運行的機制,一個程序的執(zhí)行必然是由另一個更之前的程序去啟動的 最原始的就到了操作系統(tǒng)。說白了main方法就是jvm默認找尋的方法(解釋起來比較多,設(shè)計到匯編指令,c語言的設(shè)計等等,你就可以這么理解java是c語言寫的,c語言里面使用的聲明main方法的方式作為入口,java自然也是這樣,說的更通俗一點就是編譯器的源碼中把main標(biāo)記成程序執(zhí)行的入口),擦我覺得我說的好像不是人話了。
就是說你在IDEA中點擊run跑起來的程序就是一個進程,這個進程的入口方法就是mian方法,你所說的多線程是你啟動的這個進程中的單元,當(dāng)然會在mian方法后面執(zhí)行。
好了,不寫了,我也不知道自己在寫什么了,其實知道一些,但又寫不出來,可能還是一知半解吧,希望能對你的疑問有點幫助吧。