Day16-17 多線程

多線程

  • 程序可以理解為靜態(tài)的代碼
  • 進(jìn)程可以理解為執(zhí)行中的程序。
  • 線程可以理解為進(jìn)程的進(jìn)一步細(xì)分,程序的一條執(zhí)行路徑

Thread常用方法

  • start():?jiǎn)?dòng)線程并調(diào)用run方法
  • run():改寫run方法,子線程程序
  • getName() / setName():獲取/設(shè)置線程名字
  • Thread.currentThread():返回當(dāng)前線程
  • yield():主動(dòng)放棄CPU執(zhí)行權(quán)
  • join():在A線程中調(diào)用B線程的join方法,B線程搶占CPU,A在B執(zhí)行完畢后執(zhí)行
  • isAlive():線程是否存活
  • sleep():顯示讓線程睡眠-毫秒
  • setPriority():設(shè)置優(yōu)先級(jí)
  • 線程通訊:wait() notify() notifyAll()

如何創(chuàng)建java程序的線程

方式一:繼承于Thread類,重寫run方法
方式二:實(shí)現(xiàn)Runnable接口,重寫run方法,新建Thread對(duì)象傳入接口實(shí)例

兩種方式的對(duì)比:聯(lián)系:class Thread implements Runnable
比較哪個(gè)好?實(shí)現(xiàn)的方式較好。①解決了單繼承的局限性。②如果多個(gè)線程有共享數(shù)據(jù)的話,建議使用實(shí)現(xiàn)方式,同時(shí),共享數(shù)據(jù)所在的類可以作為Runnable接口的實(shí)現(xiàn)類。

多線程的優(yōu)點(diǎn)

  • 提高應(yīng)用程序相應(yīng),增強(qiáng)用戶體驗(yàn)
  • 提高CPU利用率
  • 將復(fù)雜的進(jìn)程分成若干個(gè)線程分別執(zhí)行

線程的狀態(tài)劃分

線程的生命周期

線程的同步機(jī)制

前提:如果我們創(chuàng)建的多個(gè)線程,存在著共享數(shù)據(jù),那么就有可能出現(xiàn)線程的安全問題:當(dāng)其中一個(gè)線程操作共享數(shù)據(jù)時(shí),還未操作完成,另外的線程就參與進(jìn)來,導(dǎo)致對(duì)共享數(shù)據(jù)的操作出現(xiàn)問題。
解決方式:要求一個(gè)線程操作共享數(shù)據(jù)時(shí),只有當(dāng)其完成操作完成共享數(shù)據(jù),其它線程才有機(jī)會(huì)執(zhí)行共享數(shù)據(jù)。

方式一:同步代碼塊

synchronized(同步監(jiān)視器obj){//操作共享數(shù)據(jù)的代碼}
注:1.同步監(jiān)視器:俗稱鎖,任何一個(gè)類的對(duì)象都可以才充當(dāng)鎖。要想保證線程的安全,必須要求所有的線程共用同一把鎖!
2.使用實(shí)現(xiàn)Runnable接口的方式創(chuàng)建多線程的話,同步代碼塊中的鎖,可以考慮是this。如果使用繼承Thread類的方式,慎用this!
3.共享數(shù)據(jù):多個(gè)線程需要共同操作的變量。 明確哪部分是操作共享數(shù)據(jù)的代碼。

方式二:同步方法:將操作共享數(shù)據(jù)的方法聲明為synchronized。

比如:public synchronized void show(){ //操作共享數(shù)據(jù)的代碼}
注:1.對(duì)于非靜態(tài)的方法而言,使用同步的話,默認(rèn)鎖為:this。如果使用在繼承的方式實(shí)現(xiàn)多線程的話,慎用!
2.對(duì)于靜態(tài)的方法,如果使用同步,默認(rèn)的鎖為:當(dāng)前類本身。以單例的懶漢式為例。鎖:Singleton.class

總結(jié):釋放鎖:wait(); 不釋放鎖: sleep() yield() suspend()

suspend() (過時(shí),可能導(dǎo)致死鎖)死鎖:不同的線程分別占用對(duì)方需要的同步資源不放棄,都在等待對(duì)方放棄自己需要的同步資源,就形成了線程的死鎖死鎖是我們?cè)谑褂猛綍r(shí),需要避免的問題!

線程的通信

如下的三個(gè)方法必須使用在同步代碼塊或同步方法中!
wait():當(dāng)在同步中,執(zhí)行到此方法,則此線程“等待”,直至其他線程執(zhí)行notify()的方法,將其喚醒,喚醒后繼續(xù)其wait()后的代碼
notify()/notifyAll():在同步中,執(zhí)行到此方法,則喚醒其他的某一個(gè)或所有的被wait的線程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容