首页 > 科技 >

Java面试精讲-线程中断

2018-08-21 04:01:15 网络整理 阅读:128 评论:0

问题:请问什么叫做线程中断?为什么不能使用stop方法中断线程?

问题解析:

在正常的线程生命周期中,线程中断一直都不是一个正常的状态。

Java面试精讲-线程中断

那么什么是线程中断呢?

我们先从sleep方法开始介绍。我们都知道,如果我们想要调用thread.sleep()方法,必须要求我们catch一个InterruptedException。这个InterruptedException异常,就是由线程中断造成的。

当线程运行到一个不可控制的状态的时候,我们想尝试结束他,这个时候,使用线程的stop方法或suspend方法(这两个都是经典线程方法),但都是非常不安全的,比如调用stop方法,该方法会立刻,马上终止当前线程,就有可能造成本来还在该线程正常锁同步的内容突然破坏,让本该保护的变量被其他线程可见。虽然这个时候会抛出一个特殊的ThreadDeath()异常,但这个异常是没法被正常处理的,就有可能让其他线程消费到错误的数据。所以该方法被标记为过期。

简单的例子,比如A线程正在执行代码:

synchronized {

x = 3;

y = 4;

}

本来代码块是synchronized标记的,保证x和y总是同时能被赋值,但假如A线程执行到x=3代码的时候,突然调用了stop方法,A线程立刻被杀死,导致出现了一个潜在的不安全的数据。这个就是stop的问题所在。

到这里,第二个问题解决,为什么不能使用stop方法中断线程。

那么,我们再深入考虑一步(这也是BATJ常见的提问方式)怎么该怎么安全的中断线程呢?有多种办法,其中一种就是调用Thread.interrupt方法。interrupt方法,是一种安全的中断线程方法。

问题继续,那什么是interrupt方法?该方法有什么特征?

interrupt方法,是告诉线程,我需要中断你,但是一定注意,该方法调用之后,线程并不会立刻终止(否则就变成stop了),而是在合适的时机终止。什么时机呢?Java的处理判定机制为:

相关文章