? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 多線程
什么是多線程:
?多任務(wù)多條路徑多個順序流同時執(zhí)行就是多線程
線程的優(yōu)點:
?提高效率,同時執(zhí)行
缺點: 復(fù)雜
多線程的創(chuàng)建方式:
?1. 繼承Thread類,重寫run()方法,run方法中定義多線程的線程體
2. 實現(xiàn)Runnable接口,重寫run()方法
?推薦:
?1.避免單繼承的局限性
2.實現(xiàn)資源共享
?3. 實現(xiàn)Callable接口,重寫call方法
線程狀態(tài):
?新生狀態(tài):new創(chuàng)建一個線程的時候
?就緒狀態(tài):start(),線程會進入就緒隊列,等待cpu的調(diào)度
?運行狀態(tài):cpu調(diào)用分配時間片給線程,線程就會運行
?阻塞狀態(tài):sleep()...
? 終止?fàn)顟B(tài):線程結(jié)束了
? 一個線程一旦就如到阻塞狀態(tài),阻塞解除之后,不會馬上恢復(fù)到運行,會恢復(fù)到就緒狀態(tài),再次等待cpu的調(diào)度
?一個線程一旦進入終止?fàn)顟B(tài),再也不會恢復(fù)
?如何一個線程進入就緒狀態(tài):
?1.start()
? ?2.阻塞解除
? ?3.線程切換,被切換的線程會恢復(fù)就緒狀態(tài)
?3.yield() 禮讓線程??
? 進入阻塞狀態(tài)的方式:
? ?1.sleep
? ?2.wait
? ?3.join
?如何控制一個線程終止:
?1.stop..不推薦 2.通過表示判斷 3.正常執(zhí)行結(jié)束
?sleep(): 線程睡眠
? ?1)模擬網(wǎng)絡(luò)延遲
? ?2)放大問題的可能性
?讓出cpu的資源,不會讓出對象的鎖(保證資源睡覺),指定休息多少毫秒
線程安全:
?多線程同時操作同一份資源才有可能會出現(xiàn)線程不安全的問題,需要控制安全
?同步鎖: synchronized
? 同步方法 : 在方法上使用synchronized修飾
成員方法,相當(dāng)于鎖this,代碼范圍為方法
靜態(tài)方法,相當(dāng)于鎖類(類的class對象),代碼范圍為方法
? 同步塊 synchronized(鎖的內(nèi)容){同步的代碼范圍}
? ?鎖的內(nèi)容: this 類.class? 資源(成員變量)
?鎖的范圍:{}->中代碼的范圍
?注意:
?鎖的范圍太大,效率低
?鎖的范圍太小,鎖不住*? 鎖不變的內(nèi)容
為了讓線程排隊執(zhí)行{}中的代碼
?同步塊 synchronized(鎖的內(nèi)容){同步的代碼范圍}
?鎖的內(nèi)容: this 類.class? 資源(成員變量)
? ? 類.class 相當(dāng)于把這個類,類的所有內(nèi)容鎖住了,類的所有對象都鎖住
?this 當(dāng)前調(diào)用成員方法的對象,相當(dāng)于把這個對象的所有資源都鎖住了,可以只鎖資源
?資源: 成員變量,一定要是自定義的引用數(shù)據(jù)類型的對象
鎖的范圍:{}->中代碼的范圍
? 注意:
? ?鎖的范圍太大,效率低
?鎖的范圍太小,鎖不住
? ?鎖不變的內(nèi)容
線程通信: 生產(chǎn)者消費者模式
?wait() 等待,進入這個對象的等待池中進行等待,等待被喚醒
wait會讓出spu的資源,并且釋放對象的鎖
?notify() 喚醒? notifyAll(),喚醒對象等待池中的線程
?處于可運行的狀態(tài),但是需要滿足同步要求并被cpu調(diào)度才能執(zhí)行
? 要求使用在一個同步環(huán)境下,同步一個相同的對象才行