線程機(jī)制理解
開啟線程: Thread thread = new Thread(Runnable).start();
thread.stop()方法是直接停止線程需曾,這個方法已被啟用芽突,由于線程是開發(fā)者自己開啟的,里面的內(nèi)容也是開發(fā)者寫的输吏,線程最好停止的方式是線程自己控制澳腹,現(xiàn)在外部線程控制另一個線程的死亡是不安全的椭蹄,停止線程很有用嗅战,但是也很沒用.
thread.interrutp(),現(xiàn)在提供這種方式停止線程妄田,其本質(zhì)是向目標(biāo)線程發(fā)起一個中斷標(biāo)記,目標(biāo)線程獲取這個中斷標(biāo)記可以自己控制(開發(fā)者控制)是否關(guān)閉驮捍,這種 方式就是線程自己處理自己的關(guān)閉與否
中斷注意事項(xiàng)疟呐,可以通過線程自己的interrupt方法判斷是否標(biāo)記了中斷,這個狀態(tài)是不變的东且,還有一個是Thread.interrupted()該方法可以用來判斷當(dāng)前線程是否中斷启具,但是他有一個處理,就是判斷完之后就把狀態(tài)給重置了珊泳,這個和thread對象的中斷有點(diǎn)區(qū)別需要注意鲁冯,還有一點(diǎn)就是Thread.sleep()方法拷沸,調(diào)用該方法要處理異常try{}catch(InterruptedException),如果是sleep狀態(tài)的中斷的話會執(zhí)行異常處理并且把狀態(tài)重置薯演,所有如果要停止線程要在異常處理return,否則線程停止不掉撞芍。
鎖的wait() notifyAll()理解
class TestWait{
private String sharedString;
private synchronized void initString(){
sharedString = "huo";
notifyAll();
}
private synchronized void printString(){
while(sharedString == null){
try { wait(); }catch(InterruptedException e){ e.printStackTrace()}
}
System.out.println("String: " + sharedString);
}
}
wait會釋放鎖,當(dāng)執(zhí)行打印的時候如果沒有初始化涣仿,執(zhí)行鎖的wait()贮庞,當(dāng)前持有鎖的線程就被掛起放到等待隊(duì)列发绢,后面的線程也是如此都放入等待隊(duì)列,當(dāng)初始化線程執(zhí)行初始化后通知骨宠,所有的等待線程會被喚醒搶鎖 執(zhí)行打印代碼米罚。注意:如果printString方法沒有執(zhí)行wait,就會出發(fā)死鎖钧汹,該線程持有鎖后就無限while,其他線程獲取不到鎖,initString也執(zhí)行不了录择。還有如果synchronized 去掉的話 上面的代碼會報錯拔莱,去掉后沒有鎖了,notifyAll隘竭、wait找不到所塘秦,IllegalMontiorStateException
thread.join() 在當(dāng)前線程執(zhí)行另一個線程的thread.join()方法,會暫停當(dāng)前線程动看,指定thread線程尊剔,當(dāng)線程執(zhí)行完成后在執(zhí)行當(dāng)前線程。
Thrad.yeald()菱皆,讓出當(dāng)前線程的時間,給其他線程執(zhí)行须误。多個線程競爭執(zhí)行,讓出幾個線程呢仇轻,這個不確定京痢,不同的操作系統(tǒng)不一樣。
ThreadLocal