1.如何中斷欺冀,什么時候中斷
Thread的中斷(interrupt)不是直接打斷一個線程的執(zhí)行锦溪,而是給這個線程加上一個中斷的「標記」。比如一個線程的run方法里面阿迈,不停的打印這個線程被執(zhí)行了多少次:
//thread的run方法里的內(nèi)容:
while(true) {
// 死循環(huán)毡代,等待被中斷
System.out.println(getName() + getId() + "執(zhí)行了" + ++i + "次");
}
要實現(xiàn)的效果是一秒后這個線程中斷笤喳,不再打庸技恕:
//Interrupt test:
MyThread t = new MyThread("MyThread");
t.start();
Thread.sleep(1000);// 睡眠1000毫秒枯途,這時候t告訴CPU不需要分配資源給它了,那么其他線程就搶占了CPU資源籍滴,這樣這個線程里的其他動作就延緩執(zhí)行了
t.interrupt();// 中斷t線程
注意到上面的while(true)
酪夷,也就是說在t被中斷前它會一直打印的。上面的這個例子執(zhí)行起來會發(fā)現(xiàn)短短一瞬間打印了幾百萬次:
MyThread10執(zhí)行了1520689次
MyThread10執(zhí)行了1520690次
MyThread10執(zhí)行了1520691次
...
但是1秒鐘過去了异逐,還是在打印捶索。這是因為Thread.interrupt()只是在「禮貌地請求」中斷,不是立刻執(zhí)行中斷灰瞻。中斷是一種協(xié)作機制腥例。當(dāng)一個線程中斷另一個線程時,被中斷的線程不一定要立即停止正在做的事情酝润。
怎么處理中斷請求呢燎竖,可以通過輪詢Thread.isInterrupted() 來讀取。當(dāng)然也可以不理會中斷請求要销。比如我們用Windows的時候應(yīng)用程序卡了构回,我們點了右上角的紅叉但程序還是不會立刻關(guān)掉,這就是在發(fā)送中斷請求疏咐,但是一直沒人處理纤掸。然后我們就打開任務(wù)管理器強制關(guān)閉這個應(yīng)用程序了。
//把上面的while(true)改成下面這樣輪詢是否中斷浑塞,就會在一秒后停止打印了
while(!isInterrupted()){...}
2.中斷阻塞方法
對于interrupt()借跪,今天白天在郵件里答復(fù)錯了。酌壕。當(dāng)時回答說wait()接收到interrupt請求也需要等待輪詢isInterrupted()來檢查是否需要從阻塞狀態(tài)恢復(fù)掏愁,這是不對的,真正的情況是會立刻取消阻塞并拋出異常卵牍。
當(dāng)另一個線程通過調(diào)用 Thread.interrupt() 中斷一個線程時會發(fā)生兩種情況
- 如果那個線程在執(zhí)行一個低級可中斷阻塞方法果港,例如 Thread.sleep()、 Thread.join() 或 Object.wait()糊昙,那么它將取消阻塞并拋出 InterruptedException辛掠。
- 否則, interrupt() 只是設(shè)置線程的中斷狀態(tài)释牺。 在被中斷線程中運行的代碼以后可以輪詢中斷狀態(tài)萝衩,看看它是否被請求停止正在做的事情。
INTERRUPTED
Thread.interrupted()會清除中斷狀態(tài)(interrupted status)船侧。如果當(dāng)前線程已經(jīng)被中斷了就返回true欠气,否則返回false。換句話說镜撩,如果這個方法連續(xù)執(zhí)行了兩次预柒,第二次就會返回false(除非執(zhí)行第二次之前又中斷了)。
REFERENCE:
[1]http://www.ibm.com/developerworks/cn/java/j-jtp05236.html