众所周知,Thread 类有一个 stop 方法,可以用来终止线程。当然,这个方法连同 suspend,resume 方法一起都已经被弃用了。原因是 stop 方法终止线程过于暴力,不管被 stop 的线程在干什么,一旦被 stop 它就得立刻停止执行,然后释放锁,这是非常不安全的。

那么,有没有办法,让被 stop 的线程继续执行,并且不释放锁呢?

我写了一段代码,各位可以拿去试试:

package 

主要逻辑:

  • 先开一个线程 canNotStopThread ,它的工作很简单,加锁,然后累加 1~100;
  • 再开一个线程 thread ,它一直在等 canNotStopThread 释放锁;
  • 最后,在主线程,循环调用 stop 方法 100 次,试图终止 canNotStopThread 执行,让thread 获得锁。

这段代码不管跑多少次,都会看到如下结果:

...
rollback
rollback
rollback
rollback
i = 1
i = 2
...
i = 98
i = 99
i = 100
sum = 5050
acquired lockProcess finished with exit code 0

反应了几点:

  • 主线程 stop 了 100 次,但是没有起作用;
  • canNotStopThread 线程还是正确地累加了 1~100;
  • canNotStopThread 线程累加完毕之前,thread 线程休想得到锁,stop 也没用。

stop 方法是否能让线程终止,并且释放锁?

当然能,不用怀疑。

我的这段代码,如果把 while 循环去掉,结果就会变成这样:

rollback
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
acquired lockProcess finished with exit code 0

没有执行完,线程被终止,然后锁丢了。

让 stop 方法不能终止线程的关键是什么?

是那个 while 循环吗?不完全是。

关键点有三个:

  • catch ThreadDeath(这是个 Error),并且别抛出去,直接吃掉;
  • catch 块一行代码都不要有,如果有 finally 块,也是一行代码都不要有,只要有代码就必须 catch ThreadDeath 吃掉;
  • 来一个循环,业务流程不执行完,不要让它停下来。

为什么要吃掉 ThreadDeath?

如果你的线程被 stop 了,不管你的线程执行到了什么地方,都会立刻抛出一个 ThreadDeath。线程的 run 方法抛了 Error,线程自然就结束了,锁自然也释放了。

所以 ThreadDeath 必须要吃掉,不能让它抛出去,抛出去线程就结束了。

为什么 catch 块和 finally 块不能有代码?

试试把 run 方法改成这样:

@Override

或者这样:

@Override

这样线程就会被 stop 掉。

如果一定要在 catch 或者 finally 块里面加一些代码,比如打个日志什么的,就必须再套一层 catch:

@Override

因为你无法知道,当你的线程被 stop 的时候,它跑到哪了。如果正跑着 try 块的代码,那就没问题;如果在跑 catch 或者 finally 块代码的时候被 stop,就完蛋了。

所以,每一行代码都必须被 try 包起来,catch ThreadDeath 吃掉。因为每一行代码,准确地说,每一条指令都有抛 Error 的风险。

以上,知道了 stop 方法是如何终止线程的,就有办法让它终止不掉你的线程。

当然,这个只能说是一点有意思的奇技淫巧,没什么用啊,不建议这么搞。


首发于 CSDN 博客:

让Thread#stop方法无法终止你的线程_JinchaoLv的博客-CSDN博客_java thread.stop无法停止​blog.csdn.net

libreportparam2.dll无法继续执行代码_Java并发系列番外(1)——让Thread#stop方法无法终止你的线程...相关推荐

  1. mysql 安装问题一:由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题。

    mysql 安装问题一:由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题. 参考文章: (1)mysql 安装问题一:由于找不到MSVCR120.dll,无法继续执行 ...

  2. 由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题。

    由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题. 解决办法: 这种错误是由于未安装 vcredist 引起的,根据自己操作系统版本下载对应的安装文件. 下载地址:h ...

  3. 由于找不到mscoree.dll无法继续执行代码

    Windows终端可以说是Windows系统中非常重要的功能之一,可以帮助用户通过命令行的模式来调整电脑,但是最近不少用户在运行的时候却提示由于找不到mscoree.dll无法继续执行代码,下面小编就 ...

  4. 由于找不到vcruntime140_1.dll无法继续执行代码,vcruntime140_1.dll丢失如何修复

    在我们打开玩游戏的时候电脑突然提示由于找不到vcruntime140_1.dll无法继续执行代码是什么原因呢?因为vcruntime140_1.dll文件关键的库文件和组件,它们是许多Windows应 ...

  5. Mysql初始化安装时报错(由于找不到VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可能会解决此问题)

    今天在装mysql数据库时候遇到一个小问题,记录一下. @Mysql初始化安装时报错(由于找不到VCRUNTIME140_1.dll,无法继续执行代码.重新安装程序可能会解决此问题) 先确保电脑已经安 ...

  6. 安装mysql出现问题:由于找不到VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可能会解决此问题

    今天在安装mysql时,遇到的以前遇到的问题,就想着来整理一下. 我们直接进入主题,在我打算初始化生成data目录时候,出现了以下提示: 由于找不到VCRUNTIME140_1.dll,无法继续执行代 ...

  7. Win10玩游戏提示由于找不到xinput1 3.dll无法继续执行代码

    Win10玩游戏提示由于找不到xinput1 3.dll无法继续执行代码怎么办?一些用户使用电脑安装自己喜欢的游戏时,运行游戏的时候,遇到了错误提示.提示说缺少了一个xinput1 3.dll文件.其 ...

  8. 遇到vcruntime140_1.dll 无法继续执行代码问题

    在安装程序发现系统提示错误,找不到VCRUNTIME140_1.dll,无法继续执行代码,重新安装程序可能会解决此问题. 解决办法: 1.先查看是否已经安装有Visual C++ 如果没有就需要去下载 ...

  9. 饥荒计算机丢失xinput1 3.dll,【已解决】“由于找不到xinput1_3.dll,无法继续执行代码”...

    许多小伙伴在玩游戏或者使用电脑的过程中,电脑突然提示"由于找不到xinput1_3.dll,无法继续执行代码",导致游戏等程序无法正常启动运行,并且导致电脑系统弹窗报错.那xinp ...

最新文章

  1. 第十二届河南省ACM大学生程序设计竞赛赛后总结
  2. py_innodb_page_info.py 脚本下载
  3. android弹幕开发,android弹幕框架
  4. linux信号以及core
  5. 2013下半年福建高等学校非计算机专业学生计算机二级c语言原题,2013年福建省计算机二级c语言真题及答案(填空题部分)...
  6. thinkphp3.2.3在nginx环境下“__PUBLIC__“路径错误、URL跳转路径错误解决方案
  7. 介绍两款API管理工具
  8. Socket封装之聊天程序(二)
  9. 【问题解决】c.a.c.n.c.NacosPropertySourceBuilder : parse data from Nacos error,dataId:xxxxxx.yml
  10. java如何删除文件夹_java代码中如何删除文件夹呢?
  11. 2021-10-18 构建电影数据库MovieDB(数据库第一次实验)
  12. ubuntu搜狗输入法显示简体中文,输入却是繁体中文解决方案
  13. 全国大学生软件测试大赛web应用测试,2017全国大学生软件测试大赛Web应用测试(团体)夏季预选赛入选名单...
  14. Notion,程序员最后一款笔记软件
  15. Alpine中文字体
  16. POSCMS4 手机设置
  17. 我的世界服务器修改皮肤指令,我的世界怎么拿指令来改皮肤的 | 手游网游页游攻略大全...
  18. cad lisp 二次抛物线_用Cad画二次抛物线
  19. 当程序崩溃的时候怎么办 part-1 Iven 本文由 大侠自来也
  20. GIT - 安装、设置和帮助

热门文章

  1. 【PAT乙级】1050 螺旋矩阵 (25 分)
  2. 用C语言输出一个字符串的所有子串
  3. 红黑树(三)之 C++的实现
  4. rop检查_注意!这几类人一定要定期检查眼底!
  5. 曲面屏敲代码飞起,包邮送到家!
  6. 轻松读懂数据结构系列:早操排队图解选择排序
  7. 如何运行一个Java文件?
  8. String s=new String(abc)创建了2个对象的原因
  9. python web框架django_Python Web应用框架 Django
  10. String s=a+b+c,到底创建了几个对象?