線程的interrupt方法很特殊,有必要在這里著重說明一下。
interrupted方法是查詢是否有“中斷狀態(tài)”這一標志,而這一標志很重要很重要。
通常情況下這個標志都是沒有被設置的,一旦這個標志被設置了,則所有當前正在阻塞的方法(限定在由于wait、sleep、join三種方法引發(fā)的阻塞)都會立刻完成“跳出阻塞狀態(tài)、拋出InterruptedException異常、清除中斷狀態(tài)標志”這三件工作。仿佛線程在阻塞時,總在不斷的查詢這一標志,一旦發(fā)現(xiàn)這個標志被設置了,那么就立刻發(fā)生上述提到的三件工作。不過這只是一種猜測,至于底層到底是如何實現(xiàn)的,我們并不知道。
而我們調用interrupt方法也很有趣,通常這個標志都是未被設置的,一旦調用這個方法,它就會設置這個標志,說白了,這個方法所完成的工作也就僅僅限于設置了一個這樣的標志。接下來就能和上一段落中提到的事情相關聯(lián)了,如果線程當前是阻塞的狀態(tài),那么它會利用這個標志啦,然后做“三件事情”,然后這個標志又被清除了;如果線程當前是非阻塞狀態(tài),那么該方法的調用也就僅僅是設置一個標志而已,注意設置了這個標記就和沒設置這個標記完全不同了,一旦你再想調用sleep等阻塞方法時,它們都會“立刻跳出阻塞狀態(tài)、拋出異常、清除標記”啦,呵呵。
至此,終于清除了interrupt方法的作用了吧?