线程终止的 4 种方式

正常运行结束

这个也是最常见的,指线程体执行完成,线程自动结束。

使用退出标志退出

在一般情况下,在 run 方法执行完毕的时候,线程会正常结束。然而,有些线程是后台线程,需要长时间运行,只有在系统满足某些特殊条件后,才能退出这些线程。这时可以使用一个变量来控制循环,比如设置一个 Boolean 类型的标志,并通过设置这个标志为 true 或 false 来控制 while 循环是否退出。

public class ThreadDemo extends Thread {
    
    
	public volatile boolean exit = false;
	
    @Override
    public void run() {
    
    
		while (!exit) {
    
    
			//业务逻辑代码
		}
	}
}

在上面的代码中定义了一个退出的表示 exit,exit 的默认值为 false。在定义 exit 时使用了一个 Java 的关键字 volatile,这个关键字是用于保证 exit 线程同步安全的,也就是说在同一时刻只能有一个线程修改 exit 的值,在 exit 为true 的时候,while 循环退出,线程终止。

使用 Interrupt 方法终止线程

在使用 Interrupt 方法在终止线程的时候,是由两种情况的

  1. 线程处于阻塞状态

例如:在使用 sleep、调用锁的 wait 或者调用 socket 的 receive、accept 等方法的时候,会使线程处于阻塞状态。在调用线程的 interrupt 方法时,会抛出 InterruptException 异常,我们通过在代码中捕获异常,然后通过 break 跳出状态监测循环,结束这个线程的执行。通常很多人认为只要调用 interrupt 方法就会结束线程,这个理解其实是有问题的,一定是要先捕获 InterruptedException 异常后再通过 break 跳出循环,才能正常的结束 run 方法。

public class InterruptThread {
    
    
    public static void main(String[] args) {
    
    
        InterruptDemo thread = new InterruptDemo();
        thread.start();
        thread.interrupt();
    }
}

class InterruptDemo extends Thread {
    
    
    @Override
    public void run() {
    
    
        while (Thread.currentThread().isInterrupted()) {
    
    
            try {
    
    
                System.out.println("执行任务代码,出现了sleep");
                Thread.sleep(1000);//写的异常,出现要抛出异常的错误
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
                break;//在捕获到异常的时候,就可以退出循环了
            }
        }
    }
}

在这里插入图片描述

  1. 线程处于未阻塞状态

在这个时候,使用 isInterrupted 方法判断线程的中断标志来退出循环。在调用 interrupt 方法的时候,中断标志会设置为 true,此时并不能立刻退出线程而是需要执行线程终止前的资源释放操作,等待资源释放完毕后方可安全退出该线程。

使用 stop 方法终止线程

使用 stop 方法终止线程是不安全的
在程序中可以直接调用 Thread.stop 方法来强制终止线程,但这是很危险的,就像突然把你的电脑电源断了,而不是正常结束,这样可能就会导致一些无法预测的后果。

在程序使用 Thread.sleep 方法终止线程的时候,该线程的子线程会抛出 ThreadDeatherror 错误,并且释放子线程锁持有的所有锁,加锁的代码块一般被用于保护数据的一致性,如果在调用 Thread.stop 方法后导致该线程锁持有的所有锁突然释放而使锁的资源不可控制。被保护的数据就可能出现不一致的情况,其他线程在使用这些被破坏的数据时,就有可能是程序运行错误,因此,并不推荐采用这种方式终止线程的。


戳这里了解Java当中的锁

上一篇:===》 线程的生命周期以及各种方法

猜你喜欢

转载自blog.csdn.net/weixin_45970271/article/details/125491833
今日推荐