美文网首页
Java基础-线程中断

Java基础-线程中断

作者: 01010100 | 来源:发表于2018-01-26 11:03 被阅读9次

线程中断

@see http://www.infoq.com/cn/articles/java-interrupt-mechanism

@see https://www.ibm.com/developerworks/cn/java/j-jtp05236.html

每个线程都有一个与之相关联的 Boolean 属性,用于表示线程的中断状态(interrupted status)。中断状态初始时为 false;当另一个线程通过调用 Thread.interrupt() 中断一个线程时,会出现以下两种情况之一:

1、如果那个线程在执行一个低级可中断阻塞方法,例如 Thread.sleep()、 Thread.join() 或 Object.wait(),那么它将取消阻塞并抛出 InterruptedException

2、否则, interrupt() 只是设置线程的中断状态。 在被中断线程中运行的代码以后可以轮询中断状态,看看它是否被请求停止正在做的事情。

Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。

中断状态可以通过 Thread.isInterrupted() 来读取,并且可以通过一个名为 Thread.interrupted() 的操作读取和清除。

interrupted

public static boolean interrupted() {

    return currentThread().isInterrupted(true);

}

测试当前线程是否已经中断,线程的中断状态 由该方法清除。

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

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);

interrupt

public void interrupt() {

    if (this != Thread.currentThread())

        checkAccess();

    .

    interrupt0();          // Just to set the interrupt flag

    ...

中断线程。仅仅是设置一个中断标志位。

处理中断

一般说来,当可能阻塞的方法声明中有抛出InterruptedException则暗示该方法是可中断的,如BlockingQueue#put、BlockingQueue#take、Object#wait、Thread#sleep等,

如果程序捕获到这些可中断的阻塞方法抛出的InterruptedException或检测到中断后,这些中断信息该如何处理?一般有以下两个通用原则:

1、如果遇到的是可中断的阻塞方法抛出InterruptedException,可以继续向方法调用栈的上层抛出该异常,如果是检测到中断,则可清除中断状态并抛出InterruptedException,使当前方法也成为一个可中断的方法。

2、若有时候不太方便在方法上抛出InterruptedException,比如要实现的某个接口中的方法签名上没有throws InterruptedException(如Runnable run 方法),这时就可以捕获可中断方法的InterruptedException,

  并通过Thread.currentThread.interrupt()来重新设置中断状态。

相关文章

  • Java基础-线程中断

    线程中断 @see http://www.infoq.com/cn/articles/java-interrupt...

  • Java线程中断

    本文主要介绍Java线程中断一些相关的概念以及注意点 Java线程的中断并不是强制的中断,调用线程中断的方法时只是...

  • 线程中断

    什么是线程中断?线程中断即线程运行过程中被其他线程打断了。 线程中断的重要方法2.1 java.lang.Thre...

  • JAVA并发编程(三)线程协作与共享

    1. 线程中断 java线程中断是协作式,而非抢占式 1.1. 线程中断相关方法 interrupt()将线程的中...

  • 【多线程】——3.线程的中断

    线程中断的概念 java线程中断是一种协作机制 通过中断并不能直接终止线程的运行 需要被中断的线程自己处理中断 (...

  • (4)线程中断

    什么是线程中断 java中的线程中断并不是指强制线程中断执行,而是指调用线程中断起到一个通知作用,让线程知道自己被...

  • Java线程基础 : 线程的中断 & Interrupt

    interrupt的理解 言归正传,要中断一个Java线程,可调用线程类(Thread)对象的实例方法:inter...

  • 线程中断

    Java的中断是一种协作机制,线程中断不会终止线程的运行,但是可以通过线程中断来实现终止线程运行。 线程在不同状态...

  • Java “优雅”地中断线程(原理篇)

    前言 线程中断系列文章: Java “优雅”地中断线程(实践篇)[https://www.jianshu.com/...

  • java线程中断原理

    稍有java基础的同学都知道,在java中创建并启动一个线程比较容易,而线程中断的难度更高一些,并且使用的场景也相...

网友评论

      本文标题:Java基础-线程中断

      本文链接:https://www.haomeiwen.com/subject/mgpiaxtx.html