1. 程式人生 > >實戰JAVA 高並發設計

實戰JAVA 高並發設計

線程中斷 而是 一起 exce strong 對象 star 實戰 次方

一、同步(Synchronous)和異步(Asynchronous)

同步和異步通常用來形容一次方法調用,同步方法,調用者必須等到方法調用返回後,才能繼續後續的行為,異步方法調用會立即返回,調用者就可以繼續後續的操作

技術分享圖片

二、並發和並行

並發和並行都可以表示兩個或多個任務一起執行,但偏重點點不同,並發偏重於多個任務交替執行,而多個任務之間有可能還是串行的。而並行是真正意義上的“同時執行”。

技術分享圖片

三、阻塞(Blocking)和非阻塞(Non-Blocking)

一個線程占用了臨界資源,那麽其他所有需要這個資源的線程就必須在這個臨界區中進行等待,等待會導致線程掛起,這種情況就是阻塞,非阻塞的意思與之相反。

四、線程的狀態

技術分享圖片

線程的狀態

1、線程的啟動是調用start()方法,而不是run()方法。

2、線程的終止、不用stop()是因為stop()方法太過暴力,強行把執行到一半的線程終止,可能會引起數據不一致的問題,一般我們定義一個線程終止的方法,告知線程何時停止即可。

3、線程中斷:線程中斷並不會使線程立即退出,而是給線程發一個通知,告知目標線程,有人希望你退出,至於目標線程接到通知後如何處理,則完全由目標線程自行決定。與線程中斷的有三個方法

Thread.interrupt(): // 中斷線程

Thread.isInterrupted()://判斷是否中斷

Thread.Interrupted():// 判斷是否中斷,並清除當前中斷狀態

註:Thread.sleep()方法會拋出一個InterruptedException中斷異常,這不是運行時異常,也就是說程序必須捕獲並處理它。當線程在休眠時,如果被中斷,這個異常會產生。

4、等待(wait)和通知(notify) 註:這兩個方法是在Object類中的,意味著任何對象都可以調用這兩個方法。

obj.wait()方法,線程會停止繼續執行,轉為等待狀態,直到其他線程調用obj.notify()方法為止。調用object.wait()方法,就會進入object對象的等待隊列,當調用object.notify()時,會從這個等待隊列中,隨機選擇一個線程,並將其喚醒,這個選擇是不公平的,完全是隨機的。notifyAll()會喚醒等待隊列裏的所有線程,而不是隨機選擇一個線程。

5、掛起(suspend)和繼續執行(resume)線程

suspend與resume是一組相反的操作,調用suspend方法後的線程,必須等到resume方法調用後,才能繼續執行。

註:此方法已經被廢棄,並不推薦使用,因為suspend()在導致線程暫停的同時,並不會去釋放任何資源。此 時,若其他任何線程想要訪問被它暫用的鎖時,都會被牽連,導致無法正常繼續運行。同時,若resume()方法在suspend()前就執行了,那麽被suspend()方法掛起的線程,很難有機會被繼續執行,更為嚴重的是,它所占用的鎖不會被釋放,可能導致整個系統工作不正常。同時,對於被掛起的線程,從線程狀態上看,還是Runnable,會嚴重影響我們的判斷.

java交流群669823128

實戰JAVA 高並發設計