Java中的线程:

提示:我们应该都知道在Java中通过Thread类来实现多线程的操作,但实际上线程是操作系统的最小执行单元,java中的Thread实例实际是与操作系统中线程做了一个映射,即一个Thread代表一个线程。当然在Thread类中提供了很多操作线程的方法,今天我们着重讲解一下Thread中对于线程打断的相关方法。


中断线程:

提示:在java中可以通过调用指定方法来中断某一个线程,但是此操作只是虚假的的中断线程执行,而在操作系统层面并非真正的将线程停止执行,我们实际要控制的事是当某一个线程检测到被中断后,是否要响应此中断。

interrupt方法
作用:中断当前线程。 如果该线程在调用Object类的wait()、wait(long)或wait(long,int)方法时被阻塞,或者在调用该类的join()、join(long,int,join(long)、sleep(long)或sleep(long、int)方法中被阻塞,则其中断状态将被清除,并将收到InterruptedException。

 public void interrupt() {// 若并非线程自我打断,则校验合法性if (this != Thread.currentThread())checkAccess();synchronized (blockerLock) {Interruptible b = blocker;if (b != null) {interrupt0();           // native方法,只是设置线程的打断状态,而并非真正的停止线程b.interrupt(this);return;}}interrupt0();}

interrupted方法
作用:测试当前线程是否已中断。此方法将清除线程的中断状态。换言之,如果连续两次调用此方法,则第二次调用将返回false(除非当前线程在第一次调用清除其中断状态之后且在第二次呼叫检查它之前再次中断)。

 public static boolean interrupted() {return currentThread().isInterrupted(true);}

isInterrupted方法
作用:测试此线程是否已中断,不会清除线程的中断状态。

 public boolean isInterrupted() {return isInterrupted(false);}

从以上interrupted方法、isInterrupted方法的源码可以看出,两个方法最后实际调用的是 isInterrupted(boolean ClearInterrupted) 方法,它是一个native方法,根据方法入参来执行是否清除当前线程的中断状态。

响应中断:

提示:中断某一个线程,但当前线程的状态是RUNNABLE,若代码中没有明确定义根据线程的中断状态来执行某些响应,则该线程会正常执行后续任务;若当前线程的状态是WAITING、TIMED_WAITING,则线程立刻响应中断,并抛出异常后清空中断状态

举例调用isInterrupted方法:

/**
@Return
线程A状态:true
线程A状态:true
执行线程A
线程B状态:true
线程B状态:true
执行线程B
false
false
*/
public class Demo {public static void main(String[] args) throws InterruptedException {Thread main = Thread.currentThread();RunTask task = new RunTask(main, "A");RunTask task1 = new RunTask(main, "B");task.start();task1.start();// main线程打断指定线程task.interrupt();task1.interrupt();Thread.sleep(1000);// 此时其他线程执行完毕,再次看打断状态boolean interrupted = task.isInterrupted();boolean interrupted1 = task1.isInterrupted();System.out.println(interrupted);System.out.println(interrupted1);}public static class RunTask extends Thread {private final Thread thread;public RunTask(Thread thread, String name) {super(name);this.thread = thread;}@Overridepublic void run() {try{// 第一次看状态System.out.println("线程" + Thread.currentThread().getName() + "状态:"+ isInterrupted());// 第二次看状态是否被重置System.out.println("线程" + Thread.currentThread().getName() + "状态:"+ isInterrupted());System.out.println("执行线程" + Thread.currentThread().getName());} catch (Exception e) {System.out.println("线程异常" + Thread.currentThread().getName() + " " + isInterrupted());e.printStackTrace();}}}
}

举例调用interrupted方法:

public class Demo {/*** @return线程B状态:true线程B状态:false执行线程B线程A状态:true线程A状态:false执行线程Afalsefalse*/public static void main(String[] args) throws InterruptedException {Thread main = Thread.currentThread();RunTask task = new RunTask(main, "A");RunTask task1 = new RunTask(main, "B");task.start();task1.start();// main线程打断指定线程task.interrupt();task1.interrupt();Thread.sleep(1000);// 此时其他线程执行完毕,再次看打断状态boolean interrupted = task.isInterrupted();boolean interrupted1 = task1.isInterrupted();System.out.println(interrupted);System.out.println(interrupted1);}public static class RunTask extends Thread {private final Thread thread;public RunTask(Thread thread, String name) {super(name);this.thread = thread;}@Overridepublic void run() {try{// 第一次看状态System.out.println("线程" + Thread.currentThread().getName() + "状态:"+ interrupted());// 第二次看状态是否被重置System.out.println("线程" + Thread.currentThread().getName() + "状态:"+ interrupted());System.out.println("执行线程" + Thread.currentThread().getName());} catch (Exception e) {System.out.println("线程异常" + Thread.currentThread().getName() + " " + interrupted());e.printStackTrace();}}}
}

举例响应中断:

public class Demo {/*** @return线程A状态:false线程B状态:false线程异常A false线程异常B falsejava.lang.InterruptedExceptionat java.lang.Object.wait(Native Method)at java.lang.Thread.join(Thread.java:1252)at java.lang.Thread.join(Thread.java:1326)at com.gridsum.two.DieLockDemo$RunTask.run(DieLockDemo.java:51)java.lang.InterruptedExceptionat java.lang.Object.wait(Native Method)at java.lang.Thread.join(Thread.java:1252)at java.lang.Thread.join(Thread.java:1326)at com.gridsum.two.DieLockDemo$RunTask.run(DieLockDemo.java:51)falsefalse*/public static void main(String[] args) throws InterruptedException {Thread main = Thread.currentThread();RunTask task = new RunTask(main, "A");RunTask task1 = new RunTask(main, "B");task.start();task1.start();Thread.sleep(1000);// main线程打断指定线程task.interrupt();task1.interrupt();Thread.sleep(1000);// 此时其他线程执行完毕,再次看打断状态boolean interrupted = task.isInterrupted();boolean interrupted1 = task1.isInterrupted();System.out.println(interrupted);System.out.println(interrupted1);}public static class RunTask extends Thread {private final Thread thread;public RunTask(Thread thread, String name) {super(name);this.thread = thread;}@Overridepublic void run() {try{// 第一次看状态System.out.println("线程" + Thread.currentThread().getName() + "状态:"+ isInterrupted());// 挂起当前线程thread.join();// 第二次看状态是否被重置System.out.println("线程" + Thread.currentThread().getName() + "状态:"+ isInterrupted());System.out.println("执行线程" + Thread.currentThread().getName());} catch (Exception e) {// 抛出异常响应中断,同时清空中断状态System.out.println("线程异常" + Thread.currentThread().getName() + " " + isInterrupted());e.printStackTrace();}}}
}

总结:

  • interrupt方法用于中断某一线程
  • interrupted方法返回当前线程的中断状态,然后清除中断状态
  • isInterrupted方法返回当前线程的中断状态
  • 当中断一个在阻塞状态的线程,则该线程会响应此中断,会抛出异常并清除中断状态
  • 线程执行完后即(TERMINATED)状态,调用检测中断状态的方法总是返回false

线程中断:interrupt、interrupted、isInterrupted相关推荐

  1. 线程中断机制 interrupt、isInterrupted、interrupted方法

    ①. 什么是中断 ①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop.Thread.suspend.Thread. resume都已经被废弃了 ② ...

  2. java线程中断 interrupt

    1.  线程的状态: new -> 创建完线程,但是还没有启动 runnable -> 表示线程是活跃状态 terminated -> 表示线程已经结束了 线程在sleep的时候是什 ...

  3. 关于interrupt(),interrupted(),isInterrupted()用法分析

    我想代码是非常容易解释这个问题的了.下文会给出总结. 总结点击这里或者往下阅读: 直接来一段小代码吧: public class Interrupt {public static void main( ...

  4. 线程中断interrupt

    线程中的中断标志位 一. 与线程中断有关的3个方法: interrupt():中断线程,改变其线程的中断标志位(仅仅只有一个通知的作用),但是否中断由自己线程判断决定.false-->true ...

  5. 线程中断 interrupt

    Java的中断是一种协作机制.也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己.每个线程都有一个boolean的中断状态(这个状态不在 ...

  6. java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别

    很多Java开发人员(包括我),尤其是刚进入软件行业的新手,认为Java设置线程中断就是表示线程停止了,不往前执行了, Thread.currentThread().interrupt() 其实不是这 ...

  7. 线程中断标志位 interrupt()、interrupted()、isInterrupted() 的认识

    常见问题 首先你是怎么去关闭一个开启的线程.调用中断方法之后,线程就立即停止运行吗? 带着这两个问题探讨一下,主要围绕着这三个方法讲述: interrupt().interrupted().isInt ...

  8. 线程中断的三个方法的区别(interrupt/isInterrupted/interrupted)

    线程中断的三个方法的区别(interrupt/isInterrupted/interrupted)-总结自Java编程之美 方法定义 void interrupt():中断调用该方法的实例线程对象.当 ...

  9. 怎么查看线程的状态及interrupt优雅的关闭线程和interrupt()、interrupted()、isInterrupted()的作用以及区别在哪?

    怎么查看线程状态 jps指令查看我当前的进程ID jstack 线程ID 示例: public class StatusDemo {public static void main(String[] a ...

最新文章

  1. python代码运行不了怎么办_selenium ide 生成的 Python 代码无法执行是怎么回事?
  2. Hibernate关键字inverse和cascade
  3. [转载]为什么使用 SLF4J 而不是Log4J来做Java 日志
  4. [云炬ThinkPython阅读笔记]2.3 表达式和语句
  5. JavaScript实现判断位是不是偶数isEven算法(附完整源码)
  6. redis——内存概述
  7. 苹果iPod设计及商业操作内幕
  8. java面试 socket_java网络编程面试题
  9. vue 实现计算器功能
  10. 让你一步步成为运维专家之各种运维脚本
  11. 阿里云团队漏洞托管、渗透测试、攻防演练
  12. accumulate详细用法
  13. virtualbox E_INVALIDARG (0x80070057) 和 E_FAIL (0x80004005) SessionMachine
  14. 【经济学_01】通货膨胀 投资陷阱
  15. mc服务器改哪个文件让水流动,我的世界领地关闭水流动指令_我的世界让水变没指令...
  16. 基于虚拟筛选,从头设计的方法对蛋白酪氨酸酶1B,4-噻唑啉酮类抑制剂的研究
  17. java 获取GPU 信息(英伟达)
  18. 三国志战略版:天作之合,登庸令群魏延+沮授,官渡之战
  19. java小游戏一笔画下载安装_一笔画游戏(One touch Drawing)
  20. 一生中的那几次毕业-转载

热门文章

  1. cranberry病毒导致mycat应用都崩溃解决办法
  2. EOS是什么以及含义
  3. 哪款苹果无线充电宝最好?苹果无线充电宝哪个牌子好
  4. 计算机网络胡工程施工税率,弱电项目增值税6%、9%、13%税率怎样区分?项目经理必知...
  5. 解决tomcat 静态页面(html)中文乱码终极篇
  6. plsql 连接 虚拟机Linux下的Oracle数据库 失败
  7. 网易2017校园招聘笔试题 跳石板
  8. C语言值的引用传递—引用传递(地址传递)
  9. CSS样式自动换行(总结)
  10. 计算机主机风扇怎么庄,机箱风扇怎么装,小编教你电脑机箱风扇怎么装