线程管理(三)线程的中断
一个多个线程在执行的Java程序,只有当其全部的线程执行结束时(更具体的说,是所有非守护线程结束或者某个线程调用System.exit()方法的时候),它才会结束运行。有时,你需要为了终止程序而结束一个线程,或者当程序的用户想要取消某个Thread对象正在做的任务。
Java提供中断机制来通知线程表明我们想要结束它。中断机制的特性是线程需要检查是否被中断,而且还可以决定是否响应结束的请求。所以,线程可以忽略中断请求并且继续运行。
在这个指南中, 我们将开发一个程序,它创建线程,然后在5秒之后,它会使用中断机制来强制结束线程。
准备
指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。
怎么做呢…
按照这些步骤来实现下面的例子::
1. 创建一个名为PrimeGenerator的类,扩展Thread类。
2. 覆盖 run()方法,写一个无限循环的while循环。在循环里,我们将从1开始处理连续的数字。对于每个数字,如果它是质数,那么,我们就把它写入到操控台。
3. 处理完一个数字, 调用isInterrupted()方法来检查线程是否被中断了。如果它返回值为真,就写一个信息并结束线程的运行。
它是如果工作的…
下面是以上例子的运行结果这截图。我们可以发现 PrimeGenerator 线程是如何检测到它被中断了然后写了信息并结束运行的。 请看截图:
Thread 类还有一个boolean类型的属性来表明线程是否被中断。当你调用线程的interrupt() 方法,就代表你把这个属性设置为 true。 而isInterrupted() 方法仅返回属性值。
更多…
Thread 类还有其他可以检查线程是否被中断的方法。例如,这个静态方法interrupted()能检查正在运行的线程是否被中断。
isInterrupted()和interrupted() 方法有着很重要的区别。
第一个不会改变interrupted属性值,但是第二个会设置成false。
interrupted() 方法是一个静态方法,建议使用isInterrupted()方法。
在之前提到的,线程是可以忽略中断指令的,但是并这不是我们所期望的行为。
我们该如何正确的中断一个正在执行的线程?? 当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想不到的后果!今天,我们就以一个案例的形式,来为大家详细介绍下为何中断执行的线程不起作用。
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。
相关文章
- 面试必问:线程池的原理是什么?
- 动态代理+读写锁实现线程安全的HashMap缓存工具类
- (二)RT-Thread入门——线程管理
- 线程的安全性分析
- Hystrix线程池的使用
- Python线程的创建、执行和管理以及注意事项
- Java一个简单的线程池实现详解编程语言
- Linux中超时机制的线程管理(linux线程超时)
- Linux线程的终结之路(linux线程终止)
- 线程本地变量ThreadLocal详解编程语言
- 多线程状态及线程池管理详解编程语言
- Linux下创建多线程:一步一步指南(linux创建多个线程)
- 管理MySQL数据库线程池的最佳实践(mysql数据库线程池)
- 排查Linux线程阻塞原因(linux线程卡住)
- Linux内核调用睡眠函数实现线程调度策略(linux内核睡眠函数)
- 探讨Linux系统下线程状态变化(linux线程状态)
- 同步Linux下线程同步实现路径探索(linux下线程)
- 解锁Linux线程同步的秘密(linux的线程同步方式)
- 轻松解决Redis超时通过线程池管理(线程池解决redis超时)
- MySQL中线程占用优化查询和管理资源的重要方法(mysql中占用线程)
- 使用Redis锁替换线程锁的有效性探讨(redis锁与线程锁)
- 深入多线程之:解析线程的交会(ThreadRendezvous)详解