簡單的線程筆記

啟動(dòng)線程的兩種方式

線程的生命周期

基礎(chǔ)實(shí)現(xiàn)

1.繼承Thread

2.實(shí)現(xiàn)Runnable接口:

啟動(dòng)線程過程:一個(gè)類A實(shí)現(xiàn)了Runnable接口

//必須要把實(shí)現(xiàn)Runnable接口的對象放在Thread中運(yùn)行
A a = new A();
Thread t = new Thread(a);
a.start();

兩種實(shí)現(xiàn)方式的優(yōu)缺點(diǎn):

實(shí)現(xiàn)Runnable接口方式優(yōu)于繼承方式

①避免了java單繼承的局限性

②如果多個(gè)線程同時(shí)操作同一份資源(數(shù)據(jù)),更適合用第二種

高級(jí)實(shí)現(xiàn)

3.實(shí)現(xiàn)Callable接口通過FutureTask包裝器來創(chuàng)建Thread線程

4.Executor框架:調(diào)用Executors.類中的方法實(shí)現(xiàn),常用四種:

Executors.newCachedThreadPool();
Executors.newFixedThreadPool(2);
Executors.newScheduledThreadPool(2);
Executors.newSingleThreadExecutor();

http://www.itdecent.cn/p/a898655b787a

線程中常用的方法:

thread.start():啟動(dòng)線程并執(zhí)行run方法

thread.sleep():暫停毫秒數(shù)

thread.run() :子線程要執(zhí)行的代碼放入run()方法中

Thread.currentThread() :靜態(tài)方法,調(diào)用當(dāng)前線程

.getName():獲取當(dāng)前線程的名字

.setName():為當(dāng)前線程設(shè)置名字

thread.yield():強(qiáng)制釋放當(dāng)前線程的cpu占用權(quán)

thread.join() :在A線程中調(diào)用B線程的join()方法,當(dāng)執(zhí)行到此方法,A停止執(zhí)行,直到B執(zhí)行完畢,A繼續(xù)執(zhí)行Join()之后的代碼

thread.isAlive() :判斷當(dāng)前線程是否還存活

thread.setPriority()設(shè)置線程的優(yōu)先級(jí)

wait() notify() notifyAll() 線程通信

線程的同步

1.多個(gè)線程(三個(gè))公用一個(gè)屬性值,三個(gè)屬性會(huì)分別獲取一份當(dāng)前的屬性:可以加一個(gè)static關(guān)鍵字,但是這個(gè)靜態(tài)屬性周期太長.(基本不用)

2.1).synchronized關(guān)鍵字:

同步代碼塊

synchronized(this){
//code...
}

2).同步方法上加synchronized:

將操作的共享數(shù)據(jù)方法聲明為synchronized,同步此方法.能保證當(dāng)其中一個(gè)線程執(zhí)行此方法時(shí),其他的在外等候直到當(dāng)前線程完成

在實(shí)現(xiàn)的方式中,考慮同步的話,可喲使用this充當(dāng)鎖,但是在繼承中,慎用this

線程同步的弊端:由于同一個(gè)時(shí)間只能有一個(gè)線程訪問共享數(shù)據(jù),所以效率變低了.

死鎖

死鎖形成的原因:

系統(tǒng)資源不足
進(jìn)程(線程)推進(jìn)的順序不恰當(dāng);
資源分配不當(dāng)

死鎖形成的條件:

互斥條件:所謂互斥就是進(jìn)程在某一時(shí)間內(nèi)獨(dú)占資源。
請求與保持條件:一個(gè)進(jìn)程因請求資源而阻塞時(shí),對已獲得的資源保持不放。
不剝奪條件:進(jìn)程已獲得資源,在末使用完之前,不能強(qiáng)行剝奪。
循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

死鎖的避免策略

在編寫多線程程序之前,首先編寫正確的程序,然后再移植到多線程。
時(shí)刻檢查自己寫的程序有沒有在跳出時(shí)忘記釋放鎖。
如果自己的模塊可能重復(fù)使用一個(gè)鎖,建議使用嵌套鎖。
對于某些鎖代碼,不要臨時(shí)重新編寫,建議使用庫里面的鎖,或者自己曾經(jīng)編寫的鎖。
如果某項(xiàng)業(yè)務(wù)需要獲取多個(gè)鎖,必須保證鎖的按某種順序獲取,否則必定死鎖。
編寫簡單的測試用例,驗(yàn)證有沒有死鎖。
編寫驗(yàn)證死鎖的程序,從源頭避免死鎖。

參考: http://www.cnblogs.com/kuliuheng/p/4071555.html

生產(chǎn)者與消費(fèi)者的問題

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

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

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