[Java] 线程中断(一)

本文详细介绍了如何通过线程自身中断机制优雅地结束线程运行,避免了直接终止线程带来的安全隐患,包括状态修改、中断状态判断及示例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       正常情况下,一个线程完成它所有的任务后,就会自动退出。线程所持有的资源以及线程本身都会被释放掉。但是,在有些情况下,比如某些条件发生了改变或我们已经获得了想要的结果,这时虽然线程还没有执行完毕,但是我们已经不需要它在继续执行了,这时候就可以中断正在执行的线程。

       想象一下,要使一个正在运行的线程中断、不再继续运行,我们该怎么做呢?一种方法是我们可以直接把这个线程杀掉,就像在任务管理器里面结束进程那样。采用这种方式可以快速的中断线程,但是存在一定得安全隐患。因为线程正在运行着什么,我们并不清楚,它可能正在读写一个文件,或正在与网络资源通信,或动态分配了内存,或对共享资源加了锁,如果我们不分青红皂白,暴力的干掉它,危险也是显而易见。如内存无法释放,文件无法关闭,造成死锁等等。所以通过外力来中断一个正在运行的线程,显然不是一个很好的做法。

        既然外力不能很好的中断一个正在运行线程,那要谁去中断它呢?知己知彼,百战百胜。当然要最了解它的人去中断它。可能有人要问,谁最了解正在运行的线程呢,答案非线程本身莫属。所以要中断一个正在运行的线程,最好的做法是让它自我了断。我们要做的事就是告诉它,嗨,你该结束了。

实际上JVM也是这样做的,每一个线程都有一个状态,表明它是否已经中断,那么我们如何获得和修改这个状态呢?可以调用Thread的interrupt()。其实这个方法做的事情也不多,主要就是修改状态为中断,告诉线程它该中断了。还可以调用Thread的isInterrupted()方法来测试线程是否处于中断状态。其实interrupt()方法调用后,仅仅是状态发了改变,线程还是会正常的继续运行,那么我们只能判断线程的中断状态,自己写代码来处理具体的中断细节。

下面的示例也说明了调用interrupt()后,仅仅是状态发了变了,线程并没有中断。

 Thread t3 = new Thread(new Runnable(){
				public void run() {
					for (int i = 0; i < 5; i++) {
						System.out.println("线程执行," + i + "次!");
						System.out.println("执行中断前,是否中断:" + Thread.currentThread().isInterrupted());
						Thread.currentThread().interrupt();
						System.out.println("执行中断后,是否中断:" + Thread.currentThread().isInterrupted());
					}
				}});
		 
		 t3.start();

下面是执行结果:

线程执行,0次!
执行中断前,是否中断:false
执行中断后,是否中断:true
线程执行,1次!
执行中断前,是否中断:true
执行中断后,是否中断:true
线程执行,2次!
执行中断前,是否中断:true
执行中断后,是否中断:true
线程执行,3次!
执行中断前,是否中断:true
执行中断后,是否中断:true
线程执行,4次!
执行中断前,是否中断:true
执行中断后,是否中断:true

可以看到在第一次执行中断前,中断状态时false,执行中断后,状态变为true。此后再执行中断,对结果没有影响。
如觉得文章有不对之处,敬请指出,共同讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值