用interrupt()中断Java线程
http://hapinwater.iteye.com/blog/310558
最近在學習Java線程相關(guān)的東西,和大家分享一下,有錯誤之處歡迎大家指正.
假如我們有一個任務(wù)如下,交給一個Java線程來執(zhí)行,如何才能保證調(diào)用interrupt()來中斷它呢?
運行這個程序,我們發(fā)現(xiàn)調(diào)用interrupt()后,程序仍在運行,如果不強制結(jié)束,程序?qū)⒁恢边\行下去,如下所示:
雖然中斷發(fā)生了,但線程仍然在進行,離開線程有兩種常用的方法:
拋出InterruptedException和用Thread.interrupted()檢查是否發(fā)生中斷,下面分別看一下這兩種方法:
1.在阻塞操作時如Thread.sleep()時被中斷會拋出InterruptedException(注意,進行不能中斷的IO操作而阻塞和要獲得對象的鎖調(diào)用對象的synchronized方法而阻塞時不會拋出InterruptedException)
程序運行結(jié)果如下:
可以看到中斷任務(wù)時讓任務(wù)拋出InterruptedException來離開任務(wù).
2.Thread.interrupted()檢查是否發(fā)生中斷.Thread.interrupted()能告訴你線程是否發(fā)生中斷,并將清除中斷狀態(tài)標記,所以程序不會兩次通知你線程發(fā)生了中斷.
程序運行結(jié)果如下:
我們可結(jié)合使用兩種方法來達到可以通過interrupt()中斷線程.請看下面例子:
在point1之前處point2之后發(fā)生中斷會產(chǎn)生兩種不同的結(jié)果,可以通過修改InterruptTaskTest main()里的Thread.sleep()的時間來達到在point1之前產(chǎn)生中斷或在point2之后產(chǎn)生中斷.
如果在point1之前發(fā)生中斷,程序會在調(diào)用Thread.sleep()時拋出InterruptedException從而結(jié)束線程.這和在Thread.sleep()時被中斷是一樣的效果.程序運行結(jié)果可能如下:
如果在point2之后發(fā)生中斷,線程會繼續(xù)執(zhí)行到下一次while判斷中斷狀態(tài)時.程序運行結(jié)果可能如下:
?
總結(jié)
以上是生活随笔為你收集整理的用interrupt()中断Java线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel sample
- 下一篇: Java NIO、NIO.2学习笔记