原创转载请注明出处: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多线程编程核心技术 高洪岩 注
相关推荐
在Java多线程编程中,理解`Thread`类中的`interrupt()`、`interrupted()`和`isInterrupted()`方法至关重要,因为它们与线程中断机制紧密相关。线程中断是Java提供的一种协作式中断机制,它并不强制结束线程,而是...
本文将深入探讨`stop()`, `interrupted()`以及`isInterrupted()`这三个方法,并分析它们的工作原理和应用场景。 1. `stop()`方法: `stop()`方法在早期的Java版本中被用来强制终止一个线程的执行。但是,由于这种...
在 Java 中,线程(Thread)类提供了三个相关的方法:interrupt、isInterrupted 和 interrupted,这三个方法都是用于处理线程的中断状态的。下面我们将详细介绍这三个方法的用法和区别。 interrupt 方法 interrupt...
线程中断 常见的有以下两种方式: 通过共享的标记来进行沟通 调用 interrupt() 方法来通知 通过共享的标记来实现中断 就是创建一个boolean类型的变量来控制循环是否进行,就是一个标记。 代码如下: ...
interrupted与isInterrupted的区别: interrupted是Thread类的静态方法,里面调用了isTnterrupted方法[currentThread().isInterrupted()],测试当前线程是否已经中断,线程的中断状态由该方法清除 isInterrupted是Thread...
取而代之的是使用中断机制,这个机制主要通过`interrupt()`, `isInterrupted()`, 和 `interrupted()`三个方法来实现。 1. `interrupt()`方法:这个方法是用来设置目标线程的中断状态。当你在一个线程上调用另一个...
#### interrupt,interrupted,isInterrupted方法区别 - `interrupt`方法:用于标记当前线程为中断状态。这是一个标志位,用于指示线程是否已被请求中断。 - `interrupted`方法:返回当前线程是否已被中断,且会清除...
2. **`Thread.interrupt()` 和 `isInterrupted()`/`interrupted()` 方法** Java推荐使用更安全的中断机制,即通过`Thread.interrupt()`方法向线程发送中断信号,然后在线程的run方法中定期检查`isInterrupted()`或`...
Java提供了三种方法来实现多线程中断机制:`interrupt()`,`interrupted()`和`isInterrupted()`。这些方法都是Thread类中的方法,用于实现线程的中断机制。 1. `interrupt()`方法 `interrupt()`方法是用来中断某个...
接下来,我们关注线程的中断相关方法:`interrupt()`、`interrupted()`和`isInterrupted()`。`interrupt()`方法用于中断一个线程,设置线程的中断标志位。而`interrupted()`和`isInterrupted()`都是用来检查线程是否...
- interrupted()和isInterrupted():判断当前线程是否被中断,或者查询指定线程的中断状态。 7. 线程间通信: Java提供了wait(), notify(), notifyAll()方法来实现线程间的通信。这些方法作用于对象的监视器,...
`isInterrupted`和`interrupted`分别用于检查和检查并清除中断标志。`park`和`unpark`是`LockSupport`提供的方法,用于线程的阻塞和唤醒控制。`yield`让当前线程自愿放弃CPU时间片,但并不保证其他线程会被立即调度...
`interrupt()`可以中断一个正在运行的线程,`interrupted()`检查当前线程是否被中断过,而`isInterrupted()`检查线程的中断状态,无论该线程是否为当前线程。 - `sleep()`, `join()`, `yield()`:`sleep()`方法让...
3. `interrupted()`:这是一个静态方法,检查当前线程是否已被中断,并且调用后会清除中断标志位。如果线程被中断,返回 `true`,否则返回 `false`。 需要注意的是,中断机制是一种协作机制,调用 `interrupt()` ...
10. **中断机制**:Java的`Thread.interrupt()`方法允许线程中断自己或其它线程,配合`isInterrupted()`和`interrupted()`方法检查和响应中断请求。 在`LiveLessons_master.zip`中,很可能是包含了这些主题的示例...
9. **sleep() 和 wait() 区别**: - `sleep()`是线程类`Thread`的方法,让线程暂时停止执行,释放CPU资源,但保留对象锁;而`wait()`是`Object`类的方法,它让线程等待,放弃对象锁,直到收到`notify()`或`...
线程需要在适当的地方检查`isInterrupted()`或`interrupted()`(这两个方法的区别在于`interrupted()`会清除中断标志)来响应中断请求。 在`ThreadDemo`中,可能包含了一些处理中断的例子,比如使用`while(!Thread....
interrupt()中断线程,与isInterrupted()和interrupted()配合使用,判断和设置线程中断状态。 守护线程(Daemon Thread)是Java中的特殊线程,它们在后台运行,为用户线程提供服务,例如垃圾收集器就是守护线程。当...
4. **使用循环和isInterrupted()**:对于不抛出`InterruptedException`的阻塞操作,如自定义阻塞队列,可以在循环中使用`isInterrupted()`方法检查中断状态。如果为`true`,则跳出循环,结束线程。 5. **关闭资源**...