多线程 - Thread的interrupt机制详解

本文详细解析了Java多线程中Thread的interrupt机制,包括stop()方法的弃用原因,interrupt()的使用,以及在线程非阻塞和阻塞状态下的中断处理。还探讨了isInterrupted()和interrupted()的区别,强调了正确处理中断信号的重要性。
摘要由CSDN通过智能技术生成

上篇总结了Thread的使用和原理,那么当我们需要终止一个线程执行,该如何处理呢?

stop()方法


终止一个线程执行,我们首先想到的是Thread有没有提供终止的函数,不负所望我们找到了stop()方法(删除方法),示例代码如下

 Log.i("thread","test thread start");
 TestThread testThread = new TestThread();
 testThread.start();
 try {
     Thread.sleep(2000);
} catch (InterruptedException e) {
     e.printStackTrace();
}
testThread.stop();
Log.i("thread","test thread interrupt");

public class TestThread extends Thread {
   

        @Override
        public void run() {
            super.run();
            while (true) {
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.i("thread","test thread running");
            }
        }
    }

执行上述的代码,中了彩蛋,抛出了UnsupportedOperationException,看看stop()方法的具体实现

    @Deprecated
    public final void stop() {
        stop(new ThreadDeath());
    }

    @Deprecated
    public final synchronized void stop(Throwable throwable) {
        throw new UnsupportedOperationException();
    }

没做任何处理,直接抛出异常。
为什么不再支持stop()方法呢?如果通过stop()方法从外部来终止线程,而线程内部的处理逻辑执行到某一步的时候被强制终止,而接下来的逻辑没有被执行,这就可能导致应用出现不稳定的情况,例如假设从网上下载一个图片,先保存到磁盘再进行显示,当线程将图片写入到磁盘时,被外部强制终止了,图片没有进行显示,如果必须显示图片之后才能执行某些操作,因为线程被外部终止而无法继续进行。因此,线程由外部调用强制终止可能会导致应用一些不可预知的问题,那么如果由线程内部主动终止线程(即run()方法执行完成)或者继续执行一些必须执行完的操作,然后再终止线程,这样就可以避免这些不可预知的错误,因而有了interrupt机制来。

interrupt机制


Thread有三个关于interrupt的函数:interrupt()、interrupted()和isInterrupted()。

interrupt():中断线程,将线程的中断状态设置为true,标记线程处于中断状态;

interrupted():检查当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外;

isInterrupted():检查当前线程是否已经中断,不会清除线程的中断状态;

interrupt()

interrupt()函数只是将线程状态标记为中断状态,但不会终止线程,线程还会继续执行;

   Log.i("thread","test thread start");
   TestThread testThread = new TestThread();
   testThread.start();
   try {
        Thread.sleep(2000);
   } catch (InterruptedException e) {
        e.printStackTrace();
   }
   testThread.interrupt();
   Log.i("thread","test thread interrupt");

   public class TestThread extends Thread {
   

        @Override
        public void run() {
            super.run();
            
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值