多线程编程

不客气地说,至少有一半人认为,线程的”中断”就是让线程停止。
如果你也这么认为,那你对多线程编程还没有入门。

在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段。不但不是让线程停止运行,反而是继续执行线程的手段。

对于执行一般逻辑的线程,如果调用它的interrupt()方法,那么对这个线程没有任何
影响,比如线程a正在执行:
while(条件) x ++;
这样的语句,如果其它线程调用a.interrupt();那么并不会影响a对象上运行的线程,但中断标志会变为true。如果在其它线程里再次测试a的中断状态,则中断标志为true,但并不会停止这个线程的运行。

在一个线程对象上调用interrupt()方法,真正有影响的是wait,join,sleep方法,当然这三个方法包括它们的重载方法。

请注意:[上面这三个方法都会抛出InterruptedException],记住这句话,下面我会重复。一个线程在调用interrupt()后,自己不会抛出InterruptedException异常,所以你看到interrupt()并没有抛出这个异常,所以我上面说如果线程a正在执行while(条件) x ++;你调用a.interrupt()后线程会继续正常地执行下去.
附:
Thread.sleep()源码:

public static native void sleep(long millis) throws InterruptedException;
  • 1

Object.wait()源码:

public final native void wait(long timeout) throws InterruptedException;
  • 1

Thread.join()源码

public final synchronized void join(long millis) throws InterruptedException {...
}
  • 1
  • 2
  • 3

但是,如果一个线程被调用了interrupt()后,它的状态是阻塞状态的。而且这个状态是由于正在执行wait,join,sleep的线程导致的,那么是会改变线程的运行结果.

一. 对于wait中的等待notify、notifyAll换新的线程,其实这个线程已经“暂停”执行,因为它正在某一对象的休息室中,这时如果它的中断状态被改变,那么它就会抛出异常。这个InterruptedException异常不是线程抛出的,而是wait方法,也就是对象的wait方法内部会不断检查在此对象上休息的线程的状态,如果发现哪个线程的状态被置为已中断,则会抛出InterruptedException,意思就是这个线程不能再等待了,其意义就等同于唤醒它了,然后执行catch中的代码。

这里唯一的区别是,被nortify/All唤醒的线程会继续执行wait下面的语句,而在wait
中被中断的线程则将控制权交给了catch语句。一些正常的逻辑要被放到catch中来运行。但有时这是唯一手段,比如一个线程a在某一对象b的wait中等待唤醒,其它线程必须获取到对象b的监视锁才能调用b.notify()[All],否则你就无法唤醒线程a,但在任何线程中可以无条件地调用a.interrupt();唤醒后的逻辑你要放在catch中,当然同notify/All一样,继续执行a线程的条件还是要等拿到b对象的监视锁。

二. 对于sleep中的线程,如果你调用了Thread.sleep(一年);现在你后悔了,想让它早
些醒过来,调用interrupt()方法就是唯一手段,只有改变它的中断状态,让它从sleep中将控制权转到处理异常的catch语句中,然后再由catch中的处理转换到正常的逻辑。同样,对于join中的线程你也可以这样处理。

对于一般介绍多线程模式的书上,他们会这样来介绍:当一个线程被中断后,在进入wait,sleep,join方法时会抛出异常。是的,这一点也没有错,但是这有什么意义呢?如果你知道那个线程的状态已经处于中断状态,为什么还要让它进入这三个方法呢?当然有时是必须这么做的,但大多数时候没有这么做的理由,所以我上面主要介绍了在已经调用这三个方法的线程上调用interrupt()方法让它从这几个方法的”暂停”状态中恢复过来。这个恢复过来就可以包含两个目的:
一. [可以使线程继续执行],那就是在catch语句中执行醒来后的逻辑,或由catch语句
转回正常的逻辑。总之它是从wait,sleep,join的暂停状态活过来了。
二. [可以直接停止线程的运行],当然在catch中什么也不处理,或return,那么就完成了当前线程的使命,可以使在上面”暂停”的状态中立即真正的”停止”。

Thread.interrupt()方法理解相关推荐

  1. 从一道面试题分析Thread.interrupt方法

    阿里面试题: public class TestThread {public static void main(String[] args) {Thread t1 = new Thread() {@O ...

  2. Java Thread的interrupt方法详解

    Java Thread的interrupt方法详解 一.概述 interrupt方法的目的是给线程发出中断信号,但是不保证线程真的会中断 中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应 ...

  3. 停止Java线程,小心interrupt()方法

    转自http://www.blogjava.net/jinfeng_wang/archive/2008/04/27/196477.html 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的 ...

  4. interrupt()方法理解和实例

    本文主要讲interrupt方法的用途和用法,还请大家往下看. jdk中的描述是这样的: interrupt():中断这个线程. 除非当前线程中断自身,这是始终允许的,所以调用此线程的checkAcc ...

  5. Thread的interrupt()方法排雷

    有些时候会需要在线程的run()方法返回之前手动中止线程,这时就会用到Thread的interrupt()实例方法.这个方法的使用有许多坑,稍不注意就会出错.本文将对这个方法以及与它相关的知识点进行一 ...

  6. interrupt()方法

    title:线程中断 date:2017年11月4日23:02:38 今天来看看线程中断的问题. 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法 ...

  7. C# 多线程一: Thread 的简单理解与运用

    目录 一:进程和线程的关系 二:线程的组成 三:多线程的实现 四:C#中的线程(Thread) 1.命名空间 2.构造函数 3.属性 (1).常用属性 Name: Priority: IsAlive: ...

  8. Java Thead.interrupt 方法没有使线程停止工作

    有问题的interrupt package com.xinyu.test;public class TestInterrupt {public static void main(String[] ar ...

  9. 【代码】使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应

    import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concu ...

最新文章

  1. ​​​​​​​​​​​​​​使用dom方式遍历文档||获取元素||从元素中获取数据
  2. python 内置函数 sum()函数 求和函数
  3. tomcat 设置虚拟路径
  4. IP地址与二进制转换
  5. 2999元!联想Z6 Pro开启预售:搭载骁龙855+后置高清四摄
  6. 基于javaweb+jsp的汽车租赁管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Layui Ajax)
  7. Python简单示例-词频统计(分词)
  8. 浙大计算机就业方向,浙大四大 王牌专业,毕业后工作待遇高,发展前景非常广阔...
  9. 超级实习生计划学习笔记——Redis字符串
  10. 计算机休眠后无法唤醒出现蓝屏,笔记本电脑进入睡眠,唤醒后出现蓝屏怎么回事?...
  11. 手机app视频平台开发怎么做
  12. netstat -ano 查看端口是否被占用
  13. 使用tensorflow2.1.0+Anaconda3(python3.7.4)从制作自己的TFRrecord数据集到训练神经网络,再到载入模型进行推断
  14. 市场调研-全球与中国在线软件文档工具市场现状及未来发展趋势
  15. 野火串口助手协议发送文件通讯协议——XMODEM协议——YMODEM协议
  16. 面试官问你斐波那契数列的时候不要高兴得太早 搞懂C语言函数指针 搜索引擎还可以这么玩? 那些相见恨晚的搜索技巧...
  17. 基于skyline的城市三维建模研究
  18. 云主机配置微信公众号后台全记录 --【 阿里云ECS CentOS7 + Python3 + Flask + Nginx + Gunicorn + WeRoBot + Systemd 】
  19. 小程序获取不到用户头像和昵称返回微信用户问题解决
  20. EXCEL学习-如何设置下拉菜单

热门文章

  1. python学习-列表解析、字典解析
  2. 为什么使用NoSql及NoSql的优点
  3. android 自定义view实现拖动放大缩小_自定义itemCheckView
  4. python 中国社区_python
  5. 漫画 | 你真的会用烙铁焊接吗?
  6. 计算机必记快捷键,电脑常用的快捷键,记住这些快捷键让你瞬间变成电脑高手...
  7. 考计算机专业西南大学排名,2017西南大学优势专业排名
  8. python 视频字幕替换_利用python调整srt字幕时间轴
  9. idea实用快捷键_idea万能快捷键,你不知道的17个实用技巧!!!
  10. 2018.6.1信息安全铁人三项赛数据赛writeup