Thread类中关于中断线程,终止线程方法签名
* @Deprecated
public final void stop(); 终止线程,并不会考虑业务逻辑直接终止线程,过时方法,因为不考虑业务逻辑导致业务中断所以会出现线程安全问题
* public void interrupt(); 中断线程,并不是真正的终止了线程只是设置了一个线程中断的标志,需要我们自己根据业务做处理去终止线程
* public boolean isInterrupted(); 判断是否被中断
* public static boolean interrupted(); 判断是否被中断,清楚当前的中断状态
* public static native void sleep(long millis) throws InterruptedException; 休眠多少秒,会抛出编译器异常(线程中断抛出),不会释放锁
理解的示范代码
public class MyInterrupt {
private static final Logger logger = LoggerFactory.getLogger(MyInterrupt.class);
/**
*
* @Deprecated public final void stop() 终止线程,并不会考虑业务逻辑直接终止线程,过时方法,因为不考虑业务逻辑导致业务中断所以会出现线程安全问题
* public void interrupt() 中断线程,并不是真正的终止了线程只是设置了一个线程中断的标志,需要我们自己根据业务做处理去终止线程
* public boolean isInterrupted() 判断是否被中断
* public static boolean interrupted() 判断是否被中断,清楚当前的中断状态
* public static native void sleep(long millis) throws InterruptedException; 休眠多少秒,会抛出编译器异常(线程中断抛出),不会释放锁
*/
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
while (true) {
//获取线程标志位,是否被中断,中断直接跳出循环结束线程
if (Thread.currentThread().isInterrupted()) {
logger.info("!!!interruted");
break;
}
try {
//线程被中断,sleep()方法会抛出一个中断异常这是一个编译期异常
Thread.sleep(200);
} catch (InterruptedException e) {
//sleep()执行后,执行了后续的代码证明了sleep()没有释放锁
logger.info("thread is sleep");
//执行了sleep()方法会清除中断异常标志位
//设置中断状态
Thread.currentThread().interrupt();
}
}
});
thread.start();
Thread.sleep(3000);
//中断子线程
thread.interrupt();
}
}