1.FutureTask示例代碼
????????????? FutureTask的get方法是一個阻塞方法,需要等線程代碼執(zhí)行完畢才會接著執(zhí)行蒜埋。
???????????? ? ? FutureTask的 cancel(boolean mayInterruptIfRunning) 方法是中斷線程執(zhí)行的方法课舍,傳入false表示不允許中斷正在執(zhí)行的線程,true則表示允許中斷。
???????????????? isCancelled方法表示任務(wù)是否被取消成功良漱,如果在任務(wù)正常完成前被取消成功愧口,則返回 true睦番。
???????????????? isDone方法表示任務(wù)是否已經(jīng)完成,若任務(wù)完成耍属,則返回true托嚣;
???????????????? get(long timeout, TimeUnit unit)用來獲取執(zhí)行結(jié)果,如果在指定時間內(nèi)厚骗,還沒獲取到結(jié)果示启,就直接返回null。
2.查看線程的方法
? ?? windows下: JDK提供的查看java線程的方法jps,殺死進程的方法taskkill /F /PID xxxx
3.線程上下文切換的原因
4.睡眠的線程被喚醒?
?? 4.1調(diào)用線程的interrupt()方法 如圖4-1领舰,
?? 4.2此方法還會打斷正在執(zhí)行的線程夫嗓,如圖4-2迟螺。
?? 4.3根據(jù)interrupt方法的兩階段終止設(shè)計模式如圖4-3,因為在執(zhí)行sleep的時候會清除終止標(biāo)記所以在catch中重新標(biāo)記清楚狀態(tài)為true
?? 4.4 interrupt會影響park方法的執(zhí)行如圖4-4
? ? ?????????????????????????????????????????????????????????????????????????????????????????? 圖4-1啤月,
????????????????????????????????????????????????????????????????????????????????????????? ? ? ? ? ? ? 圖4-2
??????????????????????????????????????????????????????????????????????????????????? 圖4-3
???????????????????????????????????????????????????????????????????????????????????????????????????????????? 圖4-4 ?
5.線程睡眠的方法盡量替換成? TimeUnit.SECONDS.sleep(1); 這種方式可讀性高一點
6.yield方法
(1).是會把當(dāng)前調(diào)用此方法的線程執(zhí)行權(quán)交出去煮仇,會把當(dāng)前線程從運行狀態(tài)變成就緒狀態(tài)。
(2).還是要根據(jù)操作系統(tǒng)的調(diào)度器來實現(xiàn)谎仲,有可能交出去執(zhí)行權(quán)后cup此時比較空閑浙垫,那當(dāng)前線程有可能接著拿到執(zhí)行權(quán),接著執(zhí)行郑诺。
7.join()方法 等待線程運行結(jié)束? 主線程等待t1線程運行結(jié)束?? join(long xxx)方法是限時等待
8.守護線程在主線程結(jié)束運行后夹姥,也會隨之結(jié)束運行。
9.線程的狀態(tài)(java層面是6種狀態(tài))
????? 新建辙诞,運行辙售,停止,如果線程 調(diào)用seelp方法他的狀態(tài)是 timed waiting 飞涂,調(diào)用join方法狀態(tài)是 waiting旦部,競爭鎖失敗處于阻塞狀態(tài)是blocked
????? 情況2是 調(diào)用了wait方法,會進入Monuitor中的WaitSet集合等待较店,當(dāng)調(diào)用notify或notifyAll時士八,線程會進入EntrySet集合進行競爭資源,競爭成功則進入運行狀態(tài)梁呈,失敗則是狀態(tài)9BLOCKED
10.線程安全分析
?? 10.1 局部變量不會存在線程安全問題婚度,因為不同線程調(diào)用方法都會創(chuàng)建不同的棧幀不存在數(shù)據(jù)共享問題,
? 10.2 方法內(nèi)引用全局變量也會存在線程安全問題官卡,因為不同線程使用的是同一個值蝗茁。
10.3 引用暴漏 在子類上覆蓋父類方法也可能會出現(xiàn)線程安全問題。
11.常見線程安全類
12.偏向鎖:
???? 偏向狀態(tài):
????????? Biased就是偏向狀態(tài):默認(rèn)是開啟了偏向鎖寻咒,但是會有延遲如圖 12-1?? 01代表是無鎖狀態(tài)哮翘,4秒后打印出結(jié)果已經(jīng)開啟了偏向鎖結(jié)果是101
????????? 如圖 12-2? 添加了參數(shù) -XX:BiasedLockingStartupDelay=0 關(guān)閉延遲開啟偏向鎖,在同步代碼塊中將線程id寫入對象頭毛秘,在同步代碼結(jié)束后對象頭中依然存在線程id說明當(dāng)前鎖偏向這個id線程忍坷。
????????? 如圖12-3禁用偏向鎖參數(shù) -XX:+UseBiasedLocking 此時就會直接從無鎖狀態(tài)升級成輕量級鎖。
????????? 如圖12-4調(diào)用對象的hashcode方法就會把偏向的鎖退回到無鎖狀態(tài)熔脂,因為狀態(tài)為偏向鎖的對象頭中沒有足夠的空間存儲hashcode,輕量級鎖和重量級鎖就不會柑肴,因為輕量級鎖的hash碼會存在棧內(nèi)存的所記錄里霞揉,重量級鎖會存在Monuitor對象中,解鎖的時候會還原回來晰骑。
??????? ? 如圖12-5偏向鎖的撤銷适秩,其實就是升級到了輕量級鎖绊序,這段代碼演示了升級到輕量級鎖的過程。
????????? 如圖12-6批量撤銷20次:集合中的對象已經(jīng)偏向t1了秽荞,此時讓他批量撤銷偏向的操作骤公,偏向到第20回時線程將不會再升級,jvm會進行優(yōu)化扬跋,會讓之后的對象都偏向與t2線程不再進行偏向撤銷阶捆。
????????? 如圖 12-7批量撤銷操作40次:JVM就會覺得自已確實錯了,就不該批量偏向钦听,40次之后的默認(rèn)對象將不再是偏向狀態(tài)洒试,而是不可偏向狀態(tài)。
??????????????????????????????????????????????????????????????????????????? 圖 12-1?
???????????????????????????????????????????????????????????? ???????????????????? 圖 12-2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 圖 12-3
????????????????????????????????????????????????????????????????????????? 圖12-4
??????????????????????????????????????????????????????????????????????????????? 圖12-5
??????????????????????????????????????????????????????????????????????????????? 如圖15-6
13.wait/notify
????????? 13.1 如圖13-1 使用起來注意朴上,如果使用notifyAll的時候要避免虛假喚醒垒棋,如果喚醒的不是當(dāng)前線程,可以使用while循環(huán)的方式讓其當(dāng)前線程再次進行等待痪宰。
?????????????????????????????????????????????????????????????????????????????? 圖13-1
?????????? 原理:
13.2? 利用wait/notify 設(shè)計 保護暫停模式叼架,該模式的特點就是一對一的生產(chǎn)和消費,
?????????? 代碼gitee地址:https://gitee.com/achivedream/brief-book-code/blob/master/%E4%BF%9D%E6%8A%A4%E6%9A%82%E5%81%9C%E6%A8%A1%E5%BC%8F
13.3 利用 wait/notify 設(shè)計生產(chǎn)者消費者模式衣撬,該模式的特點不是一對一的生產(chǎn)和消費乖订,而是多對多,只要生產(chǎn)出了產(chǎn)品消費者競爭到資源就可以進行消費
???????????? 代碼gitee地址:https://gitee.com/achivedream/brief-book-code/blob/master/%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E6%A8%A1%E5%BC%8F