線程同步
自定義一個異常類
多線程
一個線程對應(yīng)一個棧和程序計數(shù)器;一個進(jìn)程對應(yīng)一個方法區(qū)和堆。
項目三
代碼復(fù)用, 當(dāng)有復(fù)用的部分或是可以抽取出來為一個功能而模塊化的時候,要抽取出來,提高可讀性
使用枚舉代替一些數(shù)字,這樣可以方便閱讀,同時如果更改數(shù)字的時候,不需要更改代碼的其他位置。
switch中直接使用枚舉的變量名;導(dǎo)包時使用static可省略類名(工具、枚舉類);
重寫toString的時候,如果直接使用super會造成不一定調(diào)用直接父類的情況,可以另建一個方法,來代替super()的使用。同時和這個方法也是public/繼承下來的,可以直接調(diào)用
數(shù)組判空,需要null以及l(fā)ength==0,看具體的情況
創(chuàng)建
方式一:繼承于Thread的類
創(chuàng)建繼承于Thread的子類
重寫Thread類的run() ;
創(chuàng)建Thread類的子類的對象
通過此對象調(diào)用start() ;兩個作用:1.啟動當(dāng)前線程 ; 2. 調(diào)用當(dāng)前線程的run() :
不能通過直接調(diào)用run() 方法的方式啟動線程
要創(chuàng)建兩個線程,必須要有兩個對象,而不能是一個對象start() 兩次;
yiled() : 釋放當(dāng)前CPU的執(zhí)行權(quán)
join() ; 在線程a中調(diào)用線程b的join(),此時線程a進(jìn)入阻塞狀態(tài),直到線程b完全執(zhí)行完以后,線程a才結(jié)束阻塞狀態(tài)
線程的優(yōu)先級
setPriority(int p) ;
getPriority() ;
MAX : 10
MIN : 1
NORM :5
方式二:
實現(xiàn)Runnable
創(chuàng)建一個實現(xiàn)了Runnable 接口的類
實現(xiàn)類去實現(xiàn)Runnable中的抽象方法 : run()
創(chuàng)建實現(xiàn)類的對象
將此對象作為參數(shù)傳遞到Thread類的構(gòu)造器中,創(chuàng)建Thread類的對象
通過Thread類的對象調(diào)用start();
兩種創(chuàng)建方式的對比:
優(yōu)先選擇 : 實現(xiàn)Runnable接口的方式
實現(xiàn)的方式?jīng)]有類的單繼承性的局限性。
實現(xiàn)的方式更適合來處理多個線程共享數(shù)據(jù)的情況
聯(lián)系:Thread 類 也實現(xiàn)了Runable 接口
相同點:兩種方式都需要重寫run()
線程的生命周期

線程安全
同步代碼塊
synchronized(同步監(jiān)視器) {
// 需要被同步的代碼
};
說明:操作共享數(shù)據(jù)的代碼,即為需要被同步的代碼
共享數(shù)據(jù):多個線程共同操作的變量。
同步監(jiān)視器:俗稱,鎖;任何一個類的對象,都可以充當(dāng)鎖;
要求:多個線程必須要共同用一把鎖
補(bǔ)充:
在實現(xiàn)Runnable接口創(chuàng)建多線程的方式中,我們可以考慮使用this來充當(dāng)同步監(jiān)視器
在繼承Threaad類創(chuàng)建多線程的方式中,慎用this充當(dāng)同步監(jiān)視器,考慮使用當(dāng)前類充當(dāng)同步監(jiān)視器
同步方法
使用同步方法解決繼承Thread類的方式的線程安全問題
同步方法仍然涉及到同步監(jiān)視器,只是不需要我們顯式的聲明。
非靜態(tài)的同步方法,同步監(jiān)視器是 : this
靜態(tài)的同步方法,同步監(jiān)視器是 當(dāng)前類本身
Lock(鎖)
先創(chuàng)建一個 ReentrantLock
lock.lock() ;
lock.unlock() ;
synchronized 與 lock 的異同?
相同:二者都可以解決線程安全問題
不同:synchronized 機(jī)制在執(zhí)行完相應(yīng)的同步代碼以后,自動的釋放同步監(jiān)視器
Lock需要手動的啟動同步(lock()),同時結(jié)束同步也需要手動的實現(xiàn)(unlock())
優(yōu)先使用順序:Lock ?--> 同步代碼塊(已經(jīng)進(jìn)入了方法體,分配了相應(yīng)的資源) --> 同步方法(在方法體之外)