——每天的寥寥幾筆,堅持下去,將會是一份沉甸甸的積累。
上一篇講到了多線程的創建和使用,以及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