一、同步(Synchronous)和非同步(Asynchronous) 同步和非同步通常用來形容一次方法調用,同步方法,調用者必須等到方法調用返回後,才能繼續後續的行為,非同步方法調用會立即返回,調用者就可以繼續後續的操作 二、併發和並行 併發和並行都可以表示兩個或多個任務一起執行,但偏重點點不同,併發偏 ...
一、同步(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