第三課 Java并發(fā)體系-第一階段-多線程基礎(chǔ)知識(shí)
一、程序、進(jìn)程、線程的理解
1、程序(programm)
概念:是為完成特定任務(wù)、用某種語(yǔ)言編寫的一組指令的集合。即指一段靜態(tài)的代碼。
2、進(jìn)程(process)
概念:程序的一次執(zhí)行過(guò)程,或是正在運(yùn)行的一個(gè)程序。
說(shuō)明:進(jìn)程作為資源分配的單位,系統(tǒng)在運(yùn)行時(shí)會(huì)為每個(gè)進(jìn)程分配不同的內(nèi)存區(qū)域
3、線程(thread)
概念:進(jìn)程可進(jìn)一步細(xì)化為線程,是一個(gè)程序內(nèi)部的一條執(zhí)行路徑。
說(shuō)明:線程作為CPU調(diào)度和執(zhí)行的單位,每個(gè)線程擁獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(pc),線程切換的開(kāi)銷小。
進(jìn)程可以細(xì)化為多個(gè)線程。
每個(gè)線程,擁有自己獨(dú)立的:棧、程序計(jì)數(shù)器
多個(gè)線程,共享同一個(gè)進(jìn)程中的結(jié)構(gòu):方法區(qū)、堆。
二、 并行與并發(fā)
(1)?單核CPU與多核CPU的理解
- 單核CPU,其實(shí)是一種假的多線程,因?yàn)樵谝粋€(gè)時(shí)間單元內(nèi),也只能執(zhí)行一個(gè)線程的任務(wù)。例如:雖然有多車道,但是收費(fèi)站只有一個(gè)工作人員在收費(fèi),只有收了費(fèi)才能通過(guò),那么CPU就好比收費(fèi)人員。如果某個(gè)人不想交錢,那么收費(fèi)人員可以把他“掛起”(晾著他,等他想通了,準(zhǔn)備好了錢,再去收費(fèi)。)但是因?yàn)镃PU時(shí)間單元特別短,因此感覺(jué)不出來(lái)。
- 如果是多核的話,才能更好的發(fā)揮多線程的效率。(現(xiàn)在的服務(wù)器都是多核的)
- 一個(gè)Java應(yīng)用程序java.exe,其實(shí)至少三個(gè)線程:main()主線程,gc()垃圾回收線程,異常處理線程。當(dāng)然如果發(fā)生異常,會(huì)影響主線程。
(2)?并行與并發(fā)的理解
并行:多個(gè)CPU同時(shí)執(zhí)行多個(gè)任務(wù)。比如:多個(gè)人同時(shí)做不同的事。
并發(fā):一個(gè)CPU(采用時(shí)間片)同時(shí)執(zhí)行多個(gè)任務(wù)。比如:秒殺、多個(gè)人做同一件事
三、創(chuàng)建線程的幾種方法
(1)? 繼承Thread類創(chuàng)建線程
多線程的創(chuàng)建,方式一:繼承于Thread類
1. 創(chuàng)建一個(gè)繼承于Thread類的子類
2. 重寫Thread類的run() --> 將此線程執(zhí)行的操作聲明在run()中
3. 創(chuàng)建Thread類的子類的對(duì)象
4. 通過(guò)此對(duì)象調(diào)用start()
?例子:遍歷100以內(nèi)的所有的偶數(shù)
(2) 實(shí)現(xiàn)Runnable接口創(chuàng)建線程
1、創(chuàng)建多線程的方式二:實(shí)現(xiàn)Runnable接口
????1. 創(chuàng)建一個(gè)實(shí)現(xiàn)了Runnable接口的類
????2. 實(shí)現(xiàn)類去實(shí)現(xiàn)Runnable中的抽象方法:run()
????3. 創(chuàng)建實(shí)現(xiàn)類的對(duì)象
????4. 將此對(duì)象作為參數(shù)傳遞到Thread類的構(gòu)造器中,創(chuàng)建Thread類的對(duì)象
????5. 通過(guò)Thread類的對(duì)象調(diào)用start()
2、 比較創(chuàng)建線程的兩種方式。
?????開(kāi)發(fā)中:優(yōu)先選擇:實(shí)現(xiàn)Runnable接口的方式
?????原因:實(shí)現(xiàn)的方式?jīng)]有類的單繼承性的局限性,實(shí)現(xiàn)的方式更適合來(lái)處理多個(gè)線程有共享數(shù)據(jù)的情況。?
同學(xué)們,基礎(chǔ)多線程部分會(huì)在下節(jié)課繼續(xù)做介紹。