一痕檬、線程的基本概念
線程理解:線程是一個(gè)程序里面不同的執(zhí)行路徑
每一個(gè)分支都叫做一個(gè)線程儒溉,main()叫做主分支桥嗤,也叫主線程毯辅。
程只是一個(gè)靜態(tài)的概念埂伦,機(jī)器上的一個(gè).class文件,機(jī)器上的一個(gè).exe文件思恐,這個(gè)叫做一個(gè)進(jìn)程沾谜。程序的執(zhí)行過程都是這樣的:首先把程序的代碼放到內(nèi)存的代碼區(qū)里面膊毁,代碼放到代碼區(qū)后并沒有馬上開始執(zhí)行,但這時(shí)候說明了一個(gè)進(jìn)程準(zhǔn)備開始基跑,進(jìn)程已經(jīng)產(chǎn)生了婚温,但還沒有開始執(zhí)行,這就是進(jìn)程媳否,所以進(jìn)程其實(shí)是一個(gè)靜態(tài)的概念栅螟,它本身就不能動(dòng)。平常所說的進(jìn)程的執(zhí)行指的是進(jìn)程里面主線程開始執(zhí)行了篱竭,也就是main()方法開始執(zhí)行了力图。進(jìn)程是一個(gè)靜態(tài)的概念,在我們機(jī)器里面實(shí)際上運(yùn)行的都是線程掺逼。
Windows操作系統(tǒng)是支持多線程的吃媒,它可以同時(shí)執(zhí)行很多個(gè)線程,也支持多進(jìn)程吕喘,因此Windows操作系統(tǒng)是支持多線程多進(jìn)程的操作系統(tǒng)赘那。Linux和Uinux也是支持多線程和多進(jìn)程的操作系統(tǒng)。DOS就不是支持多線程和多進(jìn)程了兽泄,它只支持單進(jìn)程漓概,在同一個(gè)時(shí)間點(diǎn)只能有一個(gè)進(jìn)程在執(zhí)行,這就叫單線程病梢。
CPU難道真的很神通廣大胃珍,能夠同時(shí)執(zhí)行那么多程序嗎?不是的蜓陌,CPU的執(zhí)行是這樣的:CPU的速度很快觅彰,一秒鐘可以算好幾億次,因此CPU把自己的時(shí)間分成一個(gè)個(gè)小時(shí)間片钮热,我這個(gè)時(shí)間片執(zhí)行你一會(huì)填抬,下一個(gè)時(shí)間片執(zhí)行他一會(huì),再下一個(gè)時(shí)間片又執(zhí)行其他人一會(huì)隧期,雖然有幾十個(gè)線程飒责,但一樣可以在很短的時(shí)間內(nèi)把他們通通都執(zhí)行一遍,但對(duì)我們?nèi)藖碚f仆潮,CPU的執(zhí)行速度太快了宏蛉,因此看起來就像是在同時(shí)執(zhí)行一樣,但實(shí)際上在一個(gè)時(shí)間點(diǎn)上性置,CPU只有一個(gè)線程在運(yùn)行拾并。
學(xué)習(xí)線程首先要理清楚三個(gè)概念:
進(jìn)程:進(jìn)程是一個(gè)靜態(tài)的概念
線程:一個(gè)進(jìn)程里面有一個(gè)主線程叫main()方法,是一個(gè)程序里面的,一個(gè)進(jìn)程里面不同的執(zhí)行路徑嗅义。
在同一個(gè)時(shí)間點(diǎn)上屏歹,一個(gè)CPU只能支持一個(gè)線程在執(zhí)行。因?yàn)镃PU運(yùn)行的速度很快之碗,因此我們看起來的感覺就像是多線程一樣蝙眶。
什么才是真正的多線程?如果你的機(jī)器是雙CPU继控,或者是雙核械馆,這確確實(shí)實(shí)是多線程。
二武通、線程的創(chuàng)建和啟動(dòng)
在JAVA里面,JAVA的線程是通過java.lang.Thread類來實(shí)現(xiàn)的珊搀,每一個(gè)Thread對(duì)象代表一個(gè)新的線程冶忱。創(chuàng)建一個(gè)新線程出來有兩種方法:第一個(gè)是從Thread類繼承,另一個(gè)是實(shí)現(xiàn)接口runnable境析。VM啟動(dòng)時(shí)會(huì)有一個(gè)由主方法(public static void main())所定義的線程囚枪,這個(gè)線程叫主線程±拖可以通過創(chuàng)建Thread的實(shí)例來創(chuàng)建新的線程链沼。你只要new一個(gè)Thread對(duì)象,一個(gè)新的線程也就出現(xiàn)了沛鸵。每個(gè)線程都是通過某個(gè)特定的Thread對(duì)象所對(duì)應(yīng)的方法run()來完成其操作的括勺,方法run()稱為線程體。
范例1:使用實(shí)現(xiàn)Runnable接口創(chuàng)建和啟動(dòng)新線程
開辟一個(gè)新的線程來調(diào)用run方法
多線程程序執(zhí)行的過程如下所示:
不開辟新線程直接調(diào)用run方法
運(yùn)行結(jié)果如下:
范例2:繼承Thread類曲掰,并重寫其run()方法創(chuàng)建和啟動(dòng)新的線程
使用實(shí)現(xiàn)Runnable接口和繼承Thread類這兩種開辟新線程的方法的選擇應(yīng)該優(yōu)先選擇實(shí)現(xiàn)Runnable接口這種方式去開辟一個(gè)新的線程疾捍。因?yàn)榻涌诘膶?shí)現(xiàn)可以實(shí)現(xiàn)多個(gè),而類的繼承只能是單繼承栏妖。因此在開辟新線程時(shí)能夠使用Runnable接口就盡量不要使用從Thread類繼承的方式來開辟新的線程乱豆。
三、線程狀態(tài)轉(zhuǎn)換
3.1.線程控制的基本方法
3.2. sleep/join/yield方法介紹
sleep方法的應(yīng)用范例:
運(yùn)行結(jié)果:
join方法的使用范例:
運(yùn)行結(jié)果:
yield方法的使用范例:
運(yùn)行結(jié)果如下: