前言

本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见100个问题搞定Java并发

正文

如果你阅读 JDK 有关 Thread 类的 API 文档,可能还会发现两个看起来非常有用的接口,即线程挂起( suspend )和继续执行( resume )。

这两个操作是一对相反的操作,被挂起的线程,必须要等到 resume 方法操作后,才能继续指定。

乍看之下,这对操作就像 Thread.stop() 方法一样"好用"。

但如果你仔细阅读文档说明,会发现它们也早已被标注为废弃方法,并不推荐使用。

不推荐使用 suspend 方法去挂起线程是因为 suspend 方法在导致线程暂停的同时,并不会释放任何锁资源。

此时,其他任何线程想要访问被它占用的锁时,都会被牵连,导致无法正常继续运行(如图所示)。

直到对应的线程上进行了 resume 方法操作,被挂起的线程才能继续,从而其他所有阻塞在相关锁上的线程也可以继续执行。

但是,如果 resume 方法操作意外地在 suspend 方法前就执行了,那么被挂起的线程可能很难有机会被继续执行。

并且,更严重的是:它所占用的锁不会被释放,因此可能会导致整个系统工作不正常。

而且,对于被挂起的线程,从它的线程状态上看,居然还是 Runnable ,这也会严重影响我们对系统当前状态的判断。

源码解读(JDK8)

/*** 挂起此线程。 * * 首先,调用此线程的checkAccess方法时不带参数。这可能导致抛出SecurityException(在当前线程中)。 * * 如果线程处于活跃状态,它将被挂起,并且在恢复之前不会取得进一步的进展。 * * @exception SecurityException–如果当前线程无法修改此线程。* * @deprecated 这个方法已经被弃用了,因为它天生就容易死锁。*             如果目标线程被挂起的时候在监视器上持有一个锁,用来保护关键的系统资源,则在目标线程恢复之前,任何线程都不能访问该资源。*             如果要恢复目标线程的线程在调用resume之前尝试锁定此监视器,则会导致死锁。*             这种死锁通常表现为“冻结”进程。*/
@Deprecated
public final void suspend() {checkAccess();suspend0();
}private native void suspend0();
/*** 恢复挂起的线程。 * * 首先,调用此线程的checkAccess方法时不带参数。这可能导致抛出SecurityException(在当前线程中)。 * * 如果线程处于活动状态,但处于挂起状态,则会恢复该线程,并允许其在执行过程中取得进展。 * * @exception  SecurityException–如果当前线程无法修改此线程。* * @deprecated 此方法只存在于与suspend一起使用时,suspend已被弃用,因为它容易死锁。*/
@Deprecated
public final void resume() {checkAccess();resume0();
}private native void resume0();

线程的挂起(suspend)和继续执行(resume)是什么情况?相关推荐

  1. Java线程的挂起与恢复 wait(), notify()方法介绍

    一, 什么是线程的挂起与恢复 从字面理解也很简单. 所谓线程挂起就是指暂停线程的执行(阻塞状态). 而恢复时就是让暂停的线程得以继续执行.(返回就绪状态) 二, 为何需要挂起和恢复线程. 我们来看1个 ...

  2. java怎么看具体被挂起的线程_Java线程的挂起、恢复和终止

    有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线 ...

  3. java线程暂停与恢复suspend和resume

    通过suspend()函数,可使线程进入停滞状态.通过suspend()使线程进入停滞状态后,除非收到resume()消息,否则该线程不会变回可执行状态.当调用suspend()函数后,线程不会释放它 ...

  4. 七. 多线程编程11.线程的挂起、恢复和终止

    有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线 ...

  5. java怎么看具体被挂起的线程_Java知多少(65)线程的挂起、恢复和终止

    有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线 ...

  6. java suspend wait_java中线程阻塞之sleep、suspend、wait、resume、notify方法解析

    java线程的5状态包括create.runnable.running.blocked.dead.create是指用new线程被创建,但是还没有准备好各种资源.runnable是指使用start启动线 ...

  7. java线程挂起唤醒_java线程技术6_线程的挂起和唤醒[转]

    转自:http://blog.chinaunix.net/uid-122937-id-215913.html 1. 线程的挂起和唤醒 挂起实际上是让线程进入"非可执行"状态下,在这 ...

  8. 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程

    线程的挂起是错误的概念实际是线程的阻塞 线程的主要状态有运行态,就绪态和阻塞态.挂起态对线程没有什么意义,这是由于此类状态是一个进程级的概念.特别地,如果一个进程被换出,由于它的所有线程都该进程的地址 ...

  9. 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测

    [树莓派3B+测评]线程的挂起与恢复&CPU温度检测 [复制链接] 本帖最后由 donatello1996 于 2018-12-22 17:33 编辑 在TCP通信中,除了线程的创建和删除以外 ...

最新文章

  1. android 配置ADB环境
  2. 【Eviews】第九周实验-二次/对数拟合、预测
  3. 使用bash echo 输出回车转义
  4. Hadoop-2.7.3-本地模式安装-wordcount例子
  5. php出现Cannot modify header information问题的解决方法
  6. 云消防大数据_消防云大数据
  7. 函数式编程(Functional Programming)
  8. hdu3729(二分图)
  9. 写一个控制gpio的驱动
  10. Membership Leakage in Label-Only Exposures论文解读
  11. 基于slate构建文档编辑器
  12. 不吼不叫:该如何平静地和孩子合作?
  13. 移植工具 TIA Portal
  14. Python调试工具——ipdb
  15. 收钱吧好还是网付好?
  16. idea弹窗 Placing the unmodified important.txt in the zip file with the agent jar in the same directo
  17. Mac升级Catalina,根目录下无法创建个人文件夹
  18. 华为P9黑屏的解决方案-更换屏幕
  19. mt6761平台 源码内置APK报错“/lib/xxxx.so“ not found
  20. uni-app H5打包上线流程

热门文章

  1. 类和对象——初入江湖
  2. SaaSpace:10款最佳免费编剧软件
  3. java基于ssm奶茶店进销存系统
  4. 基于TensorFlow的花卉识别
  5. 第十二章 Spring Cloud Config 统一配置中心详解
  6. 华为云桌面——云端上“最卷的云”
  7. 利用Javascript来创建Ubuntu Scope
  8. 真的能1个用户帐号登陆所有网站,问U盟?
  9. 西藏2021高考成绩排名查询,西藏高考排名查询方法,2021年西藏高考成绩位次全省排名查询...
  10. 《SGX ECALL》汇总