What does java.lang.Thread.interrupt() do?

前端 未结 9 2294
日久生厌
日久生厌 2020-11-22 06:01

Could you explain what java.lang.Thread.interrupt() does when invoked?

9条回答
  •  攒了一身酷
    2020-11-22 06:33

    For completeness, in addition to the other answers, if the thread is interrupted before it blocks on Object.wait(..) or Thread.sleep(..) etc., this is equivalent to it being interrupted immediately upon blocking on that method, as the following example shows.

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

    Output:

    $ 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
    

    Implication: if you loop like the following, and the interrupt occurs at the exact moment when control has left Thread.sleep(..) and is going around the loop, the exception is still going to occur. So it is perfectly safe to rely on the InterruptedException being reliably thrown after the thread has been interrupted:

    while (true) {
        try {
            Thread.sleep(10);
        } catch (InterruptedException ie) {
            break;
        }
    }
    

提交回复
热议问题