如何正确处理java interrupte

来源:互联网 发布:js分页代码首页尾页 编辑:程序博客网 时间:2024/05/16 14:49

目前Java的线程类Thread关于中断状态的操作有三个方法,interrupte,interrupted,isInterrupted。

interrupte 方法:类实例方法,通过调用本地方法实现的给线程设置中断状态,只是给被调用线程设置中断状态,如果被调用线程正在执行的是可中断方法,如Obejct.wait系列,join.系列,Thread.sleep系列,则会抛出InterruptedException来响应中断,并且会清理中断状态,如果之前true,只会后变false;

一开始会疑惑,为什么被调用interrupte的线程会收到InterruptedException异常呢,还有既然interrupte只是设置标志位,并不能马上中止线程的执行,我们该怎么样正确使用interrupte以及正确处理InterruptedException呢。

java里中断一个线程,之前有强占式的中断如stop方法,官方已经不建议使用,一调用该方法,被stop的线程会马上会释放所有获取的锁并在线程的run()方法内,任何一点都有可能抛出ThreadDeath Error,包括在catch或finally语句中,那么很容易照成被同步的数据没有被正确的处理完,那么其它线程在读取时就会得到脏数据。

所以现在jdk提供了协作式的中断线程的方式,也就是,给线程设置一个标志位,告诉它你是否被中断了,至于何时或者如何处理这个中断操作以及释放锁,由被调用线程自己处理。而interrupte方法就是协作式中断线程的实现。通过调用线程的interrupte方法设置中断标志为true,线程本身自己通过调用isInterrupted或者interrupted方法监测自身的中断标记是否有true来做正确处理,区别就是isInterrupted返回线程中断状态时不会还原该状态,而interrupted会清除掉中断状态,如果一个线程被中断后你调两次interrupted会得到不一样得结果,第一次为true,第二次为false。jdk里有些方法已经实现了怎么响应这种协作式中断方式,如Thread.sleep()在监测到自己已经被中断后,会抛出InterruptedException来结束自己余下业务代码的工作。那么我们在该如何正确编写响应中断的处理,或者正确中断其它线程呢。

1、如何你定义的方法式支持响应中断的,则在方法定义里声明会抛出InterruptedException

2、在业务处理核心位置通过调用isInterrupted或者interrupted监测当前线程是否被设置了中断标记,具体调用哪一个方法,取决于是否希望其它线看到你的被中断状态,如果监测到当前线程被中断,则往外抛出InterruptedException,让调用者正确处理中断。

3、在捕获到调用方法抛出的InterruptedException异常时,如果自己不知道该怎么处理的,就继续往外抛,如果时在自己的业务处理范围内的,就处理该异常,然后通过调用interrupte方法让自己标记位设置位中断状态,因为之前抛出InterruptedException时中断标记位会被清除,所以需要重新设置中断来响应其它线程的中断操作,然后返回到上一层调用,让其它调用者自己处理。

原创粉丝点击