您的位置:首页 > 编程语言 > Java开发

JAVA线程的中断

2017-05-20 19:02 288 查看

1.中断状态是什么?

每个线程都有一个boolean类型的中断状态,当中断线程时,这个线程的中断状态将被设置成true。但是,这并不意为着线程将会马上终止–中断操作并不会真正的中断一个正在运行的线程,而只是发出中断请求,然后线程在下一个合适的时刻中断自己(取消点)。

2.boolean interrupt() 请求中断

interrupt()方法会将调用该方法的线程的中断状态设置为true。

如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。—-即,当线程在调用上述方法时,接受到中断请求之后,这些方法将抛出一个InterruptedException异常告诉方法调用者,有‘人’尝试中断我,你应该对此作出反应。在这之前,它将把中断状态设置为false(阻塞操作将会被取消,但线程不会被中断)。

//源码
public void interrupt() {
//检查当前线程是否有权限中断目标线程
if (this != Thread.currentThread())
checkAccess();

synchronized (blockerLock) {
Interruptible b = blocker;
if (b != null) {
interrupt0();           // Just to set the interrupt flag
b.interrupt(this);//推断该方法用于真正中断一个线程
return;
}
}
interrupt0();
}


3.boolean isInterrupted() 返回中断状态

返回调用线程的中断状态

//源码
public boolean isInterrupted() {
return isInterrupted(false);
}


/**
* Tests if some Thread has been interrupted.  The interrupted state
* is reset or not based on the value of ClearInterrupted that is
* passed.
*/
private native boolean isInterrupted(boolean ClearInterrupted);


4.static boolean interrupted() 查询线程的中断状态,并清除其中断状态

测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。

由于interrupted()方法会清除线程的中断状态,所以对于调用该方法返回true的线程应该格外小心—-你应该处理这个中断状态:抛出一个InterruptedException或者调用当前线程的interrupt()方法使它重新处于中断状态,而不是忽视这个信息。

public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 线程