周末閑來無事新娜,看了一下關(guān)于java多線程的數(shù),每次看都有新的收獲既绩。年紀大了概龄,記憶力不怎么好,打算記下來每次的收獲饲握,方便以后隨時復(fù)習(xí)私杜。
1. interrupt(),interrupted()與isInterrupted()的區(qū)別
(1)interrupt()是對線程的一個中斷操作
首先救欧,interrupt()方法比較好理解衰粹,是對線程的一個中斷操作,沒有返回值笆怠。但實際上铝耻,改方法并不會終止一個正在運行的線程。調(diào)用interrupt()方法只是在調(diào)用線程中打了一個停止的標記蹬刷,并不是真的停止線程瓢捉。若要停止線程,需配合其他操作办成。
(2)interrupted()是一個靜態(tài)方法泊柬,對運行該方法的線程起作用
interrupted()與isInterrupted()都是返回boolean狀態(tài),判斷線程是否已終止诈火。區(qū)別是前者是一個靜態(tài)方法兽赁,只對運行改方法的線程起作用状答,可類比Thread.sleep方法;而后者不是靜態(tài)方法刀崖,是對調(diào)用方起作用惊科。
(3)interrupted()執(zhí)行以后具有將狀態(tài)標識置位false的功能
interrupted()執(zhí)行以后具有狀態(tài)置位的功能,也就是說亮钦,如果第一次調(diào)用Thread.interrupted()返回true馆截,再調(diào)用一次改方法會返回false,因為狀態(tài)被置位了蜂莉。但isInterrupted()僅僅返回線程中斷狀態(tài)蜡娶,并無置位功能。
2. 提前中斷線程的方法
推薦:主動拋異常
throw new InterruptedException();
中斷線程的方法很多映穗,如直接return也是可以的窖张。推薦使用主動拋異常的方法,原因主要是主動拋出異常中斷狀態(tài)可以繼續(xù)向上拋出蚁滋,業(yè)務(wù)邏輯若需要針對這種中斷做相應(yīng)處理就會比較方便宿接。