我是靠谱客的博主 纯情云朵,最近开发中收集的这篇文章主要介绍interrupt用法java_Thread中interrupt使用方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

合理中断线程

合理中断

在Thread类中,提供了stop(),suspend()和resume()方法,这三个方法分别是用来结束,暂停,恢复线程. 但是都已经被标记为@Deprecated废弃了. 因为一个线程不应该由其他线程来结束,他应该收到别人的通知,然后自己在合适的位置结束,如果不合理的结束,会导致很多意外的结果,比如临界区还没完全操作完,提前释放锁,但是部分状态已经改变,还有没有做一些清理操作等等.

基于上面的理由,Java提供了新的中断机制(interrupt),其他线程调用想要终止线程的interrupt()方法. 这个时候线程会根据自己的状态做出响应:

如果线程处于阻塞状态(sleep,wait,join),则线程会抛出InterruptedException异常.

如果线程处于正常运行状态,则还是正常运行,但是中断的标志被设置为true,相当于有人通知 你该结束自己了.

被调用线程处于阻塞状态

public static void main(String[] args) {

Thread thread = new Thread() {

@Override

public void run() {

try {

// 被调线程阻塞自己30s

sleep(30000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

};

try {

// 启动线程

thread.start();

// 主线程阻塞自己3秒

TimeUnit.SECONDS.sleep(3);

// 中断线程

thread.interrupt();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// ↓ out ↓

// java.lang.InterruptedException: sleep interrupted

// ...

被调用线程处于正常运行

被调用线程不处于阻塞的时候,需要调用方法来监控标志.

public static void main(String[] args) {

Thread thread = new Thread() {

@Override

public void run() {

while (!Thread.interrupted()) {

System.out.println("我还稳得住...");

}

}

};

try {

thread.start();

TimeUnit.SECONDS.sleep(3);

thread.interrupt();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// ↓ out ↓

// 我能稳得住

// ...

该程序会在检测interrupt标志,如果发现interrupt标志设置为true,则会结束自己.

interrupted()和isInterrupt()的区别

区别: 是否会清除interrupt标志. isInterrupt()方法不会改变标志,而interrupted()方法会在检测的同时,如果发现标志为true,则会返回true,然后把标志置为false.

public static void main(String[] args) {

Thread thread = new Thread() {

@Override

public void run() {

while (!Thread.interrupted()) {

System.out.println("我还稳得住...");

}

// ⚠️⚠️添加下面代码⚠️⚠️

System.out.println(Thread.interrupted());

}

};

try {

thread.start();

TimeUnit.SECONDS.sleep(3);

thread.interrupt();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// ↓ out ↓

// 我还稳得住...

// ...(省略)

// false

上面实例说明Thread.interrupted()方法会在标志为true的情况下修改interrupted的标志.

public static void main(String[] args) {

Thread thread = new Thread() {

@Override

public void run() {

// ⚠️⚠️修改方法⚠️⚠️

while (!isInterrupted()) {

System.out.println("我还稳得住...");

}

System.out.println(Thread.interrupted());

}

};

try {

thread.start();

TimeUnit.SECONDS.sleep(3);

thread.interrupt();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// ↓ out ↓

// 我还稳得住...

// ...(省略)

// true

源码解析

f5819c64eed6001238a6fe3880633e45.png

通过观察源码可以看出interrupted方法最后会调用isInterrupted(true)方法,而传入的参数代表是否清除标志位. 可以看到isInterrupted(boolean)是一个本地方法,最终会通过C/C++来执行. 而isInterrupted()最后传入的参数为false,说明不清除标志位.

最后

以上就是纯情云朵为你收集整理的interrupt用法java_Thread中interrupt使用方法的全部内容,希望文章能够帮你解决interrupt用法java_Thread中interrupt使用方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部