Thread

線程機(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)閉與否
中斷注意事項,可以通過線程自己的interrupt方法判斷是否標(biāo)記了中斷,這個狀態(tài)是不變的,還有一個是Thread.interrupted()該方法可以用來判斷當(dāng)前線程是否中斷,但是他有一個處理,就是判斷完之后就把狀態(tài)給重置了,這個和thread對象的中斷有點區(qū)別需要注意,還有一點就是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)前持有鎖的線程就被掛起放到等待隊列,后面的線程也是如此都放入等待隊列,當(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

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

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