java核心卷之多線程核心部分學習筆記(二)

——每天的寥寥幾筆,堅持下去,將會是一份沉甸甸的積累。


上一篇講到了多線程的創建和使用,以及synchronized關鍵字的使用和注意點,那都是基礎知識。

今天再來說說多線程的幾個方法和中斷操作(屬於中級知識,本文內容不多,但都是本人總結的一些關鍵點,如果還是不清楚可以去詳細查下相關知識,很重要)。

1.常用函數

void wait()
導致線程進入等待狀態直到被通知喚醒,只能在一個同步方法中被調用。
如果當前對象不是對象鎖的持有者,該方法拋出一個IllegalMonitorException

void notify()
隨機解除一個在該對象上調用wait方法的線程的阻塞狀態,該方法只能在通步方法或同步塊中被調用。
如果當前對象不是對象鎖的持有者,該方法拋出一個IllegalMonitorException

void notifyAll()
解除所有那些在該對象上調用wait方法的線程的阻塞狀態,該方法只能在通步方法或同步塊中被調用。
如果當前對象不是對象鎖的持有者,該方法拋出一個IllegalMonitorException

void wait(long millis,[int nanos])
導致線程進入等待狀態直到被通知或經過指定的時間,該方法只能在同步方法中被調用。
如果當前對象不是對象鎖的持有者,該方法拋出一個IllegalMonitorException

void interrupt()
向線程發送中斷請求,線程的中斷狀態將被置爲true。
如果目前該線程被調用阻塞(sleep,wait,join),則會拋出一個InterruptException異常

static boolean interrupted()//慎用
測試當前線程是否處於中斷狀態。同時會將中斷狀態置爲false。

boolean isInterrupted()
測試當前線程是否處於中斷狀態。不會讓中斷狀態發生變化。


2.明確中斷的含義。

線程的中斷(interrupt)只是改變了線程的中斷狀態,至於這個中斷狀態改變後帶來的結果,那是無法確定的,有時它更是讓停止中的線程繼續執行的唯一手段,不但不是讓線程停止運行,反而是繼續執行線程的手段。

說白了,interrupt函數的調用只是“委婉地提醒該對象,你的中斷位已被置爲true,這時你可以通過isInterrupted()監聽到,建議你採取相應的處理措施”。但至於該對象怎麼做,其他線程都無法干預。


3.注意InterruptedException

當拋出InterruptException後該對象的中斷位會被置爲false。也就是說拋出異常,進入catch內部時,中斷已經不是原來的true了,這樣會改變原來被中斷的狀態而使得isInterrupted()無法監聽到,這種改變原意的行爲是危險的,因此建議,在catch內部加上一句Thread.currentThread.interrupt(),再一次將中斷位置爲false



發佈了52 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章