這個(gè)東西不用說,必學(xué),必用,面試必問
一.概念
先來介紹一下進(jìn)程線程的區(qū)別,進(jìn)程就是一個(gè)電腦上運(yùn)行的各個(gè)應(yīng)用程序.而線程就是進(jìn)程里面的各種功能.如QQ是個(gè)進(jìn)程,而QQ里面你能打字,查看信息,語音,等等就是它的一個(gè)個(gè)線程了.所以線程組成進(jìn)程.一個(gè)進(jìn)程至少有一個(gè)線程.CPU的執(zhí)行也是以線程為基本單位的.也就是執(zhí)行的是一個(gè)個(gè)線程.
單核一次只能執(zhí)行一個(gè)線程啊,線程轉(zhuǎn)換的太快,讓你以為一次執(zhí)行多個(gè).有時(shí)間片這個(gè)概念,當(dāng)然這都是基礎(chǔ),概念,百度看看就都懂了.
了解一下并行和并發(fā)
所以程序員追求高并發(fā)不追求高并行.
多線程的優(yōu)勢,想都不用想,可以支持高并發(fā)么,可以支持多人訪問不卡么,各種快速完成一個(gè)任務(wù)啦.比如合理利用多核系統(tǒng),不然永遠(yuǎn)單線程用一個(gè)核多不好,多浪費(fèi)
二.具體
Java使用多線程有兩點(diǎn)
1.繼承threan類和實(shí)現(xiàn)Runnable接口,其實(shí)實(shí)現(xiàn)Runnable接口本質(zhì)還是繼承thread類.
實(shí)現(xiàn)Runnable接口的實(shí)現(xiàn)方法也和上面一樣.在實(shí)現(xiàn)方法上沒什么區(qū)別.但兩者在其他方面還是有很大的區(qū)別的.
2.thread和Runnable的區(qū)別(推薦使用Runnable接口):
簡單說接口可以繼承多個(gè),類只能一個(gè),復(fù)雜點(diǎn)就是下面.Runnable可以多個(gè)線程處理一個(gè)事物.而thread是一個(gè)線程處理一個(gè).但也不一定,只是thread實(shí)現(xiàn)比較復(fù)雜.
三.來看看里面的方法和區(qū)別
1.先來看看為了解決線程沖突,即保證線程執(zhí)行的原子性.使用的解決辦法.
同步代碼塊和同步方法差不多,都是使用了Synchronized關(guān)鍵字,他能保證原子性.但使用它后效率不是很高,所以使用lock鎖更好一點(diǎn).
(Lock)鎖機(jī)制:使用這個(gè)會(huì)比Synchronized好一點(diǎn).
2.線程的執(zhí)行流程,非常非常重要.
3.線程中的sleep,wait啊等等方法
這些方法在上面那個(gè)線程流程圖中有了很詳細(xì)很立體的介紹了,先把上面那個(gè)圖看懂了,很重要.下面是詳細(xì)介紹.
這些就是基本方法了.
四.來看看死鎖,這個(gè)也經(jīng)常問.
死鎖就是兩個(gè)線程發(fā)生了互相調(diào)用.都不放開導(dǎo)致的
五.線程池
一個(gè)線程不停的啟用關(guān)閉太浪費(fèi)時(shí)間,還給服務(wù)器造成了壓力,所以出現(xiàn)了線程池,在一個(gè)線程用完時(shí)先不關(guān)閉,放在線程池中.等待下次再用
在大公司面試時(shí),會(huì)問你會(huì)不會(huì)理解線程池的源碼.
上面幾乎就包含了基礎(chǔ)面試問的所有東西.幾乎是必問.再看完后推薦再看看這個(gè),人家說的很系統(tǒng),
https://www.cnblogs.com/GarfieldEr007/p/5746362.html
在難一點(diǎn)看看線程池的實(shí)現(xiàn)
https://blog.csdn.net/evankaka/article/details/51489322
在還有線程技術(shù)的實(shí)現(xiàn)內(nèi)幕,及原理
https://blog.csdn.net/column/details/javahhighconcurrence.html
都能看完你就無敵了.期待補(bǔ)充哈.