代码之家  ›  专栏  ›  技术社区  ›  oneat

是什么java.lang.Thread线程.interrupt()怎么办?

  •  180
  • oneat  · 技术社区  · 16 年前

    你能解释一下吗 java.lang.Thread.interrupt() 什么时候调用?

    8 回复  |  直到 13 年前
        1
  •  266
  •   Taogen Jia Mike Q    6 年前

    Thread.interrupt() 设置目标线程的中断状态/标志。然后,在该目标线程中运行的代码可以轮询中断状态并对其进行适当的处理。一些阻止的方法,例如 Object.wait() 可能会立即使用中断状态并引发适当的异常(通常 InterruptedException )

    Java中的中断不是先发制人的。换句话说,为了正确处理中断,两个线程必须协作。如果目标线程没有轮询中断状态,中断将被有效地忽略。

    Thread.interrupted() 方法返回当前线程的中断状态并清除该中断标志。通常线程会执行一些操作,比如抛出InterruptedException。

    • 对象。等等() , Thread.sleep() ,和 Thread.join()
    • 最多 java.util.concurrent 结构
    • Java NIO(但不是java.io文件)它不使用 中断异常 ,而不是使用 ClosedByInterruptException .

    编辑(从 @thomas-pornin exactly same question 完整性)

    线程中断是轻推线程的一种温和方式。它用于给线程一个退出的机会 干净利落 Thread.stop() 那更像是用突击步枪射线。

        2
  •  72
  •   Tomasz Stanczak    10 年前

    什么是中断?

    中断是对中断的指示 线程,它应该停止它是什么 让程序员来决定 线程如何响应中断, 终止。

    如何实施?

    实现了中断机制 使用称为 中断状态。调用 线程中断设置此标志。什么时候? 线程通过 调用静态方法 线程已中断,中断状态 已清除。非静态 一个线程查询中断 另一个的状态,不改变 中断状态标志。

    引用自 Thread.interrupt() API :

    此线程的checkAccess方法是 调用,这可能会导致

    如果此线程在 或的wait(long,int)方法 对象类,或join()的, 中断状态将被清除,并且 它将收到 中断异常。

    如果此线程在I/O中被阻塞 接收ClosedByInterruptException。

    如果此线程在 立即从选择 操作,可能是非零 已调用唤醒方法。

    保持这个线程的中断

    请查看以下内容,以获得对相同内容的完整理解:

    http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

        3
  •  16
  •   Thilo    16 年前

    如果目标线程一直在等待(通过调用 wait() sleep() ),它将被中断,这意味着它停止等待它正在等待的内容,而是接收InterruptedException。

    这完全取决于线程本身(调用 等待() )决定在这种情况下该怎么办。它不会自动终止线程。

        4
  •  13
  •   Evgeni Sergeev    12 年前

    为了完整,除了其他答案, Object.wait(..) 或 Thread.sleep(..) ,如下例所示。

    public class InterruptTest {
        public static void main(String[] args) {
    
            Thread.currentThread().interrupt();
    
            printInterrupted(1);
    
            Object o = new Object();
            try {
                synchronized (o) {
                    printInterrupted(2);
                    System.out.printf("A Time %d\n", System.currentTimeMillis());
                    o.wait(100);
                    System.out.printf("B Time %d\n", System.currentTimeMillis());
                }
            } catch (InterruptedException ie) {
                System.out.printf("WAS interrupted\n");
            }
            System.out.printf("C Time %d\n", System.currentTimeMillis());
    
            printInterrupted(3);
    
            Thread.currentThread().interrupt();
    
            printInterrupted(4);
    
            try {
                System.out.printf("D Time %d\n", System.currentTimeMillis());
                Thread.sleep(100);
                System.out.printf("E Time %d\n", System.currentTimeMillis());
            } catch (InterruptedException ie) {
                System.out.printf("WAS interrupted\n");
            }
            System.out.printf("F Time %d\n", System.currentTimeMillis());
    
            printInterrupted(5);
    
            try {
                System.out.printf("G Time %d\n", System.currentTimeMillis());
                Thread.sleep(100);
                System.out.printf("H Time %d\n", System.currentTimeMillis());
            } catch (InterruptedException ie) {
                System.out.printf("WAS interrupted\n");
            }
            System.out.printf("I Time %d\n", System.currentTimeMillis());
    
        }
        static void printInterrupted(int n) {
            System.out.printf("(%d) Am I interrupted? %s\n", n,
                    Thread.currentThread().isInterrupted() ? "Yes" : "No");
        }
    }
    

    输出:

    $ javac InterruptTest.java 
    
    $ java -classpath "." InterruptTest
    (1) Am I interrupted? Yes
    (2) Am I interrupted? Yes
    A Time 1399207408543
    WAS interrupted
    C Time 1399207408543
    (3) Am I interrupted? No
    (4) Am I interrupted? Yes
    D Time 1399207408544
    WAS interrupted
    F Time 1399207408544
    (5) Am I interrupted? No
    G Time 1399207408545
    H Time 1399207408668
    I Time 1399207408669
    

    线程。睡眠(..) 因此,在线程被中断后可靠地抛出InterruptedException是完全安全的

    while (true) {
        try {
            Thread.sleep(10);
        } catch (InterruptedException ie) {
            break;
        }
    }
    
        5
  •  5
  •   akash G    9 年前

    线程中断基于标志 中断状态 . 中断状态 设置为 假 . 无论何时 方法,中断状态设置为 是的 .

    1. 那条特殊的线 去睡觉吧。如果在该线程上调用sleep,则会引发中断异常。再次抛出异常后,标志设置为false。
    2. 如果线程已经休眠并且 中断()
        6
  •  4
  •   Sanchi Girotra    10 年前

    Thread.interrupt() 使用选中时,将目标线程的中断状态/标志设置为true Thread.interrupted() 可以帮助阻止无尽的线程。参考 http://www.yegor256.com/2015/10/20/interrupted-exception.html

        7
  •  1
  •   Ajeet Ganga    11 年前

    公共无效中断()

    中断此线程。

    如果此线程在调用对象类的wait()、wait(long)或wait(long,int)方法时被阻塞,或者在调用此类的join()、join(long)、join(long,int)、sleep(long)或sleep(long,int)方法时被阻塞,则其中断状态将被清除,并且它将接收到InterruptedException。

    如果该线程在选择器中被阻塞,那么该线程的中断状态将被设置,并且它将立即从选择操作返回,可能返回一个非零值,就像调用了选择器的唤醒方法一样。

    如果前面的条件都不成立,那么这个线程的中断状态将被设置。

    中断一个非活动线程不需要有任何效果。

    抛出: SecurityException-如果当前线程无法修改此线程

        8
  •  1
  •   Adi    11 年前

    中断是对线程的一种指示,它应该停止正在执行的操作并执行其他操作。由程序员来决定线程如何响应中断,但是线程终止是很常见的。 非常好的参考: https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

        9
  •  1
  •   Anatolii Shuba    7 年前

    按照惯例,