欢迎光临散文网 会员登陆 & 注册

线程该如何终止

2023-08-22 09:45 作者:J加乐  | 我要投稿

关于线程的终止,自然结束才是好

也许你会想使用thread.stop(),这个是直接强行终止线程,容易出现尿到一半叫你缩回去的事,自然不行。

为什么不用stop()方法:

一般来说,当一个线程的方法体执行完,这个方法就会结束了。我们一般不直接使用stop方法来终止线程,这可能会导致业务逻辑不完整或者破坏原子性的操作,一段代码可能用来输出某些重要的信息,在方法的执行中使用stop方法终止线程,会使得输出的信息破坏或者不完整;

假如:在原子操作比如重入锁的使用时,当一个线程对象多次获得锁会使得计数加一,接下来需要以相同的次数释放锁直到计数减到0,别的线程才能获得锁资源,这种操作是原子性的,因为对线程来说,他们拿到锁和最终释放锁时计数都是为0的,因此这是一种原子性操作,假设在一个对象使用锁的期间,使用stop方法强行终止线程,这会导致锁的计数不为0,即破坏了原子性操作。综合来说,我们如果要正确地终止一个线程,不应该使用stop()这种过时的方法。

比较常用的是以下两种方法:
1、使用while循环轮询标志位,为false则退出循环,结束方法体,终止线程。

2、使用interrupt()方法在线程阻塞状态下结束线程。 

都是  通知结束(根据状态判断是否进入中断流程,本质都一样)

Thread.currentThread().interrupt();    // 设置线程中断状态,理解发出一个中断信号

Thread.interrupted();     // 返回中断状态信息,并将状态恢复默认值false

Thread.currentThread().isInterrupted();     //检测此线程是否中断,返回中断状态信息,但不会清除中断状态

 

例:

public class MyThread extends Thread {

    public void run() {

        try {

            while (!Thread.currentThread().isInterrupted()) {

                // 执行线程的任务

                // 模拟阻塞状态

                Thread.sleep(1000);

            }

        } catch (InterruptedException e) {

            // 响应中断请求

            System.out.println("线程被中断");

        }

    }

    public static void main(String[] args) {

        MyThread thread = new MyThread();

        thread.start();

        // 等待一段时间后,调用 interrupt() 方法来中断线程

        try {

            Thread.sleep(5000);

            // 这里改变发出中断信号 改变Thread.currentThread().isInterrupted()的结果

            thread.interrupt(); 

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}


线程该如何终止的评论 (共 条)

分享到微博请遵守国家法律