什么是Thread
官方解釋:
線程(英語:thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實際運(yùn)作單位。一條線程指的是進(jìn)程中一個單一順序的控制流,一個進(jìn)程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。(維基百科)
多線程
什么是多線程?
單CPU時代,單任務(wù)在一個時間點(diǎn)只能執(zhí)行單一程序,且不存在真正意義上的多線程,多線程只是微觀上串行,宏觀上并行,因為電腦來回切換線程執(zhí)行的速度很快,所以用戶感覺不到,但現(xiàn)在計算機(jī)發(fā)展到多處理器,可以實現(xiàn)真正意義上的多線程,即一個處理器處理一個線程.
為什么要使用多線程?
大家都知道CPU是寶貴的資源,一條線程執(zhí)行的任務(wù)不一定全部都需要CPU來執(zhí)行,IO操作,這時候CPU是空閑的,多線程可以讓一個線程不用的時候,CPU 讓給另一個線程來使用. 提高了資源利用率,進(jìn)而又提高了用戶的體驗.
多線程越多越好嗎?
結(jié)合上一章我們知道,線程切換需要消耗一定的資源,所以多線程也需要控制在合理的范圍內(nèi)才可以更好的發(fā)揮其魅力. 并不是越多越好上一章還提到,線程還需要一些內(nèi)存來維持它本地的堆棧。它也需要占用操作系統(tǒng)中一些資源來管理線程,請注意這里,下面會用到.
多線程并發(fā)
準(zhǔn)備
- 你需要了解java 內(nèi)存模型
- 硬件內(nèi)存架構(gòu)和JVM之間的關(guān)系
- 理解Java的堆和棧,引用是在棧上, 而對象是在堆上.(有特殊情況)
簡述每一個運(yùn)行在Java虛擬機(jī)里的線程都擁有!自己的線程棧!,也就是棧。這個線程棧包含了這個線程調(diào)用的方法當(dāng)前執(zhí)行點(diǎn)相關(guān)的信息。一個線程僅能訪問自己的線程棧。
竟態(tài)條件
由上句話可知,每個線程都有自己對資源的引用,比如屏幕當(dāng)前顯示的一張圖片,線程一中謂之"image1"(棧中的名稱而已"),線程二中謂之"image2",而引用的對象是在堆上的,或者是其他的公共資源(圖片在公共內(nèi)存中),如文件等,是共享的,而存放在堆上的對象可以被所有持有對這個對象引用的線程訪問(兩個線程都可以修改各自的image1/image2)。當(dāng)進(jìn)行一個對象操作的時候,線程會將這個對象從堆上讀取到自己的寄存器里處理(拿過來畫成豬),在處理完之后,會將結(jié)果返回(放回去顯示),但是在過程中如果有線程也對此對象進(jìn)行了操作呢(線程二拿過來畫成牛)?那就可能出現(xiàn)混亂和不可預(yù)知的結(jié)果("最后是豬還是牛").這也就是所謂的"競態(tài)條件"
知道他是什么,知道他從哪里來,知道他為什么來,知道他來了干什么,才可謂之學(xué)問啊
預(yù)知后事如何,且聽下回分解.