线程 - 这段危险代码90%的人都写过!

简介: 线程 - 这段危险代码90%的人都写过!

最近一个同学发来消息说,公司里有一段代码使用的线程经常会发生一些莫名其妙的问题。让我帮忙看看,我仔细看了很多遍线程的相关代码。最后注意到了 InterruptException 异常,把想法和 demo 代码给他说了后,问题果真被解决了。


关于这个问题,我通过一段简化的代码来给大家演示一下。



image.png



看到上面这段 demo 了吗?多简单,多熟悉啊。但是有一个问题,90% 的人可能都没有遇到,但确实存在的。


我们先看 Thread.sleep 为什么要抛出一个异常?其实,很简单,你仔细想想,如果你正在睡觉的时候,突然有人打扰到你,是不是就相当于发生了中断睡觉的异常。而 InterruptedException 这个异常的发生就是因为有人打扰了这个线程的休眠。


谁打扰的呢?就是调用这个线程的 interrupt() 方法的对象。OK ,现在我们来看看,当我调用上面这个线程的 interrupt() 方法的时候,它正在休眠,那么就会发生 InterruptedException 异常。而这个时候,你却把 InterruptedException 异常捕捉了,于是本该停止的线程就行失去刹车的车辆一样裸奔了。


而正确的处理 InterruptedException 异常的方法是,捕捉异常之后,加一个 break,终止线程。除此之外,结束一个线程推荐的方法有 3 种。



image.png


现在我们再来看看为什么 Thread.stop、Thread.suspend、Thread.resume、Runtime.runFinalizersOnExit 这几个方法都被废弃了。这是因为,这几个操作太暴力了。stop() 方法会真的杀死线程,不给线程喘息的机会,如果线程持有 ReentrantLock 锁,被 stop() 的线程并不会自动调用 ReentrantLock 的 unlock() 去释放锁,那其他线程就再也没机会获得 ReentrantLock 锁,这实在是太危险了。所以该方法就不建议使用了,类似的方法还有 suspend() 和 resume() 方法、Runtime.runFinalizersOnExit() 方法,这 3 个方法同样也都不建议使用了。危害性都非常大,所以被废弃的方法你千万不要使用!


目录
相关文章
|
2月前
多线程案例-定时器(附完整代码)
多线程案例-定时器(附完整代码)
244 0
|
4月前
|
数据采集 Python
【Python自动化】多线程BFS站点结构爬虫代码,支持中断恢复,带注释
【Python自动化】多线程BFS站点结构爬虫代码,支持中断恢复,带注释
28 0
|
4月前
|
Java
Java使用线程池代码
Java使用线程池代码
36 0
|
4月前
|
消息中间件 Dubbo Java
多线程到底用不用在业务代码上???
在当今的软件开发中,多线程技术是一种常见的优化方式,可以显著提高程序的性能和响应能力。然而,对于业务代码是否应该使用多线程,不同的开发者和专家可能会有不同的看法和经验。在这篇文章中,我们将探讨多线程在业务代码中的应用,并分析其利弊。综上所述,是否在业务代码中使用多线程需要根据具体情况来决定。如果业务系统需要同时处理多个任务,并且每个任务都可以独立地执行,那么使用多线程可以提高系统的性能和响应能力。然而,如果业务逻辑比较简单,或者系统的设计不允许使用多线程,那么使用单线程可能更加简单和安全。
67 1
|
7月前
|
机器学习/深度学习 负载均衡 算法
计算机网络编程 | 并发服务器代码实现(多进程/多线程)
计算机网络编程 | 并发服务器代码实现(多进程/多线程)
87 0
|
7月前
|
Java 程序员 调度
如何用Java编写代码来等待一个线程join()??
如何用Java编写代码来等待一个线程join()??
21 0
|
4月前
|
Java
|
7月前
|
安全 网络协议 Java
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
40 0
|
5月前
|
IDE C# 开发工具
C# | 多线程批量下载文件(创建N个线程同时批量下载文件,只需要几行代码而已)
批量下载文件时使用多线程可以有效缩短完成时间,本文将讲解如何使用C#+CodePlus扩展库快速完成多线程的文件下载。 大部分代码由IDE自动生成,需要我们自己编写的代码正好**10行**。也就是说,只需要10分钟,就可以手撸一个多线程的批量下载器。
95 0
C# | 多线程批量下载文件(创建N个线程同时批量下载文件,只需要几行代码而已)
|
2月前
|
消息中间件 并行计算 网络协议
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
41 0