`

interrupted()和isInterrupted()的区别

 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/2359893

 

Method in Java Doc


 

调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真正的停止线程

package org.fool.java.concurrent.interrupt;

public class InterruptTest1 {

    public static void main(String[] args) {
        try {
            Thread thread = new Thread(new MyThread());
            thread.start();
            Thread.sleep(5000);
            thread.interrupt();
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
    }

    public static class MyThread implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 200000; i++) {
                System.out.println("i = " + (i + 1));
            }
        }
    }
}

Console Output


Note:

从运行结果来看,调用interrupt方法并没有停止线程

 

interrupted()

测试当前线程是否已经中断

package org.fool.java.concurrent.interrupt;

public class InterruptTest2 {

    public static void main(String[] args) {
        try {
            Thread thread = new Thread(new MyThread());
            thread.start();
            Thread.sleep(1000);
            thread.interrupt();
            System.out.println("is interrupted 1: " + thread.interrupted());
            System.out.println("is interrupted 2: " + thread.interrupted());
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
    }

    public static class MyThread implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 50000; i++) {
                System.out.println("i = " + (i + 1));
            }
        }
    }
}

Console Output


Note:

从控制台打印的结果来看,线程并未停止,这也证明了interrupted()方法的解释:测试当前线程是否已经中断。本例中这个“当前线程”是main,它从未中断过,所以打印的结果是两个false 

 

修改Main函数

package org.fool.java.concurrent.interrupt;

public class InterruptTest3 {

    public static void main(String[] args) {
        try {
            Thread thread = new Thread(new MyThread());
            thread.start();
            Thread.sleep(1000);
            Thread.currentThread().interrupt();
            System.out.println(Thread.currentThread().getName());
            System.out.println("is interrupted 1: " + Thread.currentThread().interrupted());
            System.out.println("is interrupted 2: " + Thread.currentThread().interrupted());
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
    }

    public static class MyThread implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 50000; i++) {
                System.out.println("i = " + (i + 1));
            }
        }
    }
}



Console Output


Note:

控制台第一次打印的结果是true,第二次为false;Java Doc中给出的解释是:测试当前线程是否已经中断,线程的中断状态由该方法清除。即如果连续两次调用该方法,则第二次调用将返回false(在第一次调用已清除flag后以及第二次调用检查中断状态之前,当前线程再次中断的情况除外)

所以,interrupted()方法具有清除状态flag的功能 

 

isInterrupted()

测试线程是否已经中断

package org.fool.java.concurrent.interrupt;

public class InterruptTest4 {

    public static void main(String[] args) {
        try {
            Thread thread = new Thread(new MyThread());
            thread.start();
            Thread.sleep(1000);
            thread.interrupt();
            System.out.println("is interrupted 1: " + thread.isInterrupted());
            System.out.println("is interrupted 2: " + thread.isInterrupted());
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
    }

    public static class MyThread implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 200000; i++) {
                System.out.println("i = " + (i + 1));
            }
        }
    }
}

Console Output


is interrupted 1: true 


is interrupted 2: true


Note:

isInterrupted()并未清除状态flag,所以打印两个true

 

Summary

interrupted(): 测试当前线程是否已经是中断状态,执行后具有清除中断状态flag的功能

isInterrupted(): 测试线程Thread对象是否已经是中断状态,但不清除中断状态flag 

 

Reference

Java多线程编程核心技术 高洪岩 注

 

 

  • 大小: 47.1 KB
  • 大小: 18.5 KB
  • 大小: 16.4 KB
  • 大小: 16.6 KB
  • 大小: 15.7 KB
  • 大小: 5.3 KB
  • 大小: 5.7 KB
分享到:
评论

相关推荐

    Thread类的interrupt(),interrupted(),isInterrupted()1

    在Java多线程编程中,理解`Thread`类中的`interrupt()`、`interrupted()`和`isInterrupted()`方法至关重要,因为它们与线程中断机制紧密相关。线程中断是Java提供的一种协作式中断机制,它并不强制结束线程,而是...

    JAVA多线程之中断机制stop()、interrupted()、isInterrupted()

    本文将深入探讨`stop()`, `interrupted()`以及`isInterrupted()`这三个方法,并分析它们的工作原理和应用场景。 1. `stop()`方法: `stop()`方法在早期的Java版本中被用来强制终止一个线程的执行。但是,由于这种...

    java线程中的interrupt,isInterrupt,interrupted方法

    在 Java 中,线程(Thread)类提供了三个相关的方法:interrupt、isInterrupted 和 interrupted,这三个方法都是用于处理线程的中断状态的。下面我们将详细介绍这三个方法的用法和区别。 interrupt 方法 interrupt...

    线程中断的方法以及静态方法isInterrupted和实例方法interrupted的区别

    线程中断 常见的有以下两种方式: 通过共享的标记来进行沟通 调用 interrupt() 方法来通知 通过共享的标记来实现中断 就是创建一个boolean类型的变量来控制循环是否进行,就是一个标记。 代码如下: ...

    java8源码-JavaSE-Code:JavaSE的代码练习与学习笔记总结

    interrupted与isInterrupted的区别: interrupted是Thread类的静态方法,里面调用了isTnterrupted方法[currentThread().isInterrupted()],测试当前线程是否已经中断,线程的中断状态由该方法清除 isInterrupted是Thread...

    Java中interrupt的使用.docx

    取而代之的是使用中断机制,这个机制主要通过`interrupt()`, `isInterrupted()`, 和 `interrupted()`三个方法来实现。 1. `interrupt()`方法:这个方法是用来设置目标线程的中断状态。当你在一个线程上调用另一个...

    Java多线程教程吐血整理干货.md

    #### interrupt,interrupted,isInterrupted方法区别 - `interrupt`方法:用于标记当前线程为中断状态。这是一个标志位,用于指示线程是否已被请求中断。 - `interrupted`方法:返回当前线程是否已被中断,且会清除...

    java线程强制停止的两个Demo

    2. **`Thread.interrupt()` 和 `isInterrupted()`/`interrupted()` 方法** Java推荐使用更安全的中断机制,即通过`Thread.interrupt()`方法向线程发送中断信号,然后在线程的run方法中定期检查`isInterrupted()`或`...

    Java多线程中断机制三种方法及示例

    Java提供了三种方法来实现多线程中断机制:`interrupt()`,`interrupted()`和`isInterrupted()`。这些方法都是Thread类中的方法,用于实现线程的中断机制。 1. `interrupt()`方法 `interrupt()`方法是用来中断某个...

    java多线程例子.doc

    接下来,我们关注线程的中断相关方法:`interrupt()`、`interrupted()`和`isInterrupted()`。`interrupt()`方法用于中断一个线程,设置线程的中断标志位。而`interrupted()`和`isInterrupted()`都是用来检查线程是否...

    java多线程例子.pdf

    - interrupted()和isInterrupted():判断当前线程是否被中断,或者查询指定线程的中断状态。 7. 线程间通信: Java提供了wait(), notify(), notifyAll()方法来实现线程间的通信。这些方法作用于对象的监视器,...

    JUC学习.docx Java

    `isInterrupted`和`interrupted`分别用于检查和检查并清除中断标志。`park`和`unpark`是`LockSupport`提供的方法,用于线程的阻塞和唤醒控制。`yield`让当前线程自愿放弃CPU时间片,但并不保证其他线程会被立即调度...

    Java线程学习

    `interrupt()`可以中断一个正在运行的线程,`interrupted()`检查当前线程是否被中断过,而`isInterrupted()`检查线程的中断状态,无论该线程是否为当前线程。 - `sleep()`, `join()`, `yield()`:`sleep()`方法让...

    java中的多线程笔记

    3. `interrupted()`:这是一个静态方法,检查当前线程是否已被中断,并且调用后会清除中断标志位。如果线程被中断,返回 `true`,否则返回 `false`。 需要注意的是,中断机制是一种协作机制,调用 `interrupt()` ...

    这个存储库包含了我的关于Java并发编程的LiveLessons课程和我的各种LiveTraining课程的所有源代码.zip

    10. **中断机制**:Java的`Thread.interrupt()`方法允许线程中断自己或其它线程,配合`isInterrupted()`和`interrupted()`方法检查和响应中断请求。 在`LiveLessons_master.zip`中,很可能是包含了这些主题的示例...

    《java基础入门》第三版 第十二章作业.doc

    9. **sleep() 和 wait() 区别**: - `sleep()`是线程类`Thread`的方法,让线程暂时停止执行,释放CPU资源,但保留对象锁;而`wait()`是`Object`类的方法,它让线程等待,放弃对象锁,直到收到`notify()`或`...

    ThreadDemo

    线程需要在适当的地方检查`isInterrupted()`或`interrupted()`(这两个方法的区别在于`interrupted()`会清除中断标志)来响应中断请求。 在`ThreadDemo`中,可能包含了一些处理中断的例子,比如使用`while(!Thread....

    2019年VIPKID Java工程师一面1

    interrupt()中断线程,与isInterrupted()和interrupted()配合使用,判断和设置线程中断状态。 守护线程(Daemon Thread)是Java中的特殊线程,它们在后台运行,为用户线程提供服务,例如垃圾收集器就是守护线程。当...

    java中断线程的正确姿势完整示例.rar

    4. **使用循环和isInterrupted()**:对于不抛出`InterruptedException`的阻塞操作,如自定义阻塞队列,可以在循环中使用`isInterrupted()`方法检查中断状态。如果为`true`,则跳出循环,结束线程。 5. **关闭资源**...

Global site tag (gtag.js) - Google Analytics