关于线程 interrupt

 我来答
完满且闲雅灬抹香鲸P
2022-07-23 · TA获得超过1.7万个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:70.6万
展开全部

Thread有四个interrupt相关的方法interrupt()、interrupted()、isInterrupted()、isInterrupted(boolean ClearInterrupted),他们分别的作用是什么?

sleep()、wait()、join()这些方法抛出的InterruptedException跟这几个方法又有什么关系?

我们查看interrupt()、interrupted()、isInterrupted()、isInterrupted(boolean ClearInterrupted)这四个方法的注释,会发现都提到了一个状态interrupt status,这个状态true/false即为线程状态的一个标识位, 注意,这只是线程的一种中断机制,不一定会中断正在运行的线程,只是告诉线程选择在合适的时机中断自己。 这句话怎么理解呢?

也就是说我们的线程正常运行,外界通过一些操作改变了线程的interrupt status,线程并不会中断,只是改变了线程的interrupt status。

例1

例1 执行结果如下,可见interrupt方法只是改变了interrupt status,并没有中断线程的执行

sleep()、wait()、join()这些方法抛出的InterruptedException就跟interrupt status有关,这几个方法会一直监听interrupt status,一旦监听到这个status为true,则会抛出InterruptedException,并且会把这个状态clear为false。

例2

执行结果如下:

通过例1,我们知道调用interrupt方法,会把interrupt status置为true,而这里sleep监听interrupt status为true后会抛出InterruptedException,并且又将interrupt status重新clear为false,例2验证了这点。

现在理解了interrupt status这点后,我们就可以反过来看一下interrupt()、interrupted()、isInterrupted()、isInterrupted(boolean ClearInterrupted)这四个方法。

interrupt方法就是调用native方法将interrupt status置为true

isInterrupted()方法是一个native方法,会返回当前线程是否被interrupted,并且会根据传参ClearInterrupted来判断是否重置interrupt status

isInterrupted() 方法调用的上面的isInterrupted(boolean ClearInterrupted),并且传参false,说明会返回interrupt status,但是不会重置interrupt status

interrupted()方法也是调用的isInterrupted(boolean ClearInterrupted)方法,并且传参true,同样会返回interrupt status,并且会将状态重置为false

总结:线程的这种中断机制,是把线程的中断交给线程自己去处理,线程内部通过interrupt status去合理的中断线程,比如去清理资源等,而不是暴力的直接终止线程的运行。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式