终止线程的 4 种方式(interrupt)

正常运行结束

程序运行结束,线程自动结束。

使用标志位

一般 run() 方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如:最直接的方法就是设一个 boolean 类型的标志,并通过设置这个标志为 true 或 false 来控制 while 循环是否退出,代码示例:

public class ThreadSafe extends Thread {
	
	public volatile boolean exit = false;
	
	public void run() {
		while(!exit){
			//do something
		}
	}
}

定义了一个退出标志 exit,当 exit 为 true 时,while 循环退出,exit 的默认值为 false。在定义 exit 时,使用了一个 Java 关键字 volatile,这个关键字的目的是使 exit 同步,也就是说在同一时刻只能由一个线程来修改 exit 的值。

interrupt() 方法

使用 interrupt() 方法,通知线程应该中断了,但具体被通知的线程是中断还是继续去执行,应该由被通知的线程自己去处理。

调用 interrupt() 时有以下两种情况:

  1. 如果线程处于被阻塞状态(由 wait()、sleep()、join() 操作引起),那么线程立即退出阻塞并抛出一个 InterruptedException 异常,同时会将中断标志清除。

  2. 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true。被设置中断标志的线程将继续正常运行,不受影响。

因此,interrupt() 并不能真正的中断线程,需要被调用的线程自己配合才行。

  1. 在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程

  2. 在调用 interrupt() 时,正确处理 InterruptedException 异常,例如在 catch 异常后就结束线程。

package Thread;

public class ThreadInterruptDemo extends Thread {

    public static void main(String[] args) throws InterruptedException {
        ThreadInterruptDemo thread = new ThreadInterruptDemo();
        thread.start();
        Thread.sleep(200);
        thread.interrupt();
        System.out.println("main");
    }

    @Override
    public void run() {
        while (true) {
            if (Thread.interrupted()) {
                System.out.println(Thread.currentThread().getName() + "--interrupt 结束线程");
                break;
            }
            try {
                System.out.println(Thread.currentThread().getName() + "--线程开始休眠");
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + "--线程结束休眠");
            } catch (InterruptedException e) {
				// e.printStackTrace();
                System.out.println(Thread.currentThread().getName()+"--线程异常退出");
                break;
            }
        }
    }
}

stop() 方法

程序中可以直接使用 thread.stop() 来强行终止线程,但是 stop 方法是很危险的,就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,不安全主要是:如果在调用 thread.stop() 后导致了该线程所持有的所有锁的突然释放(不可控制),那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。因此,并不推荐使用 stop() 方法来终止线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值