信贷网站开发,株洲网站制作建设,深圳公司黄页企业名录,新闻门户网站什么意思转载自 一文搞懂 Java 线程中断
在之前的一文《如何优雅地终止一个线程》中详细说明了 stop 终止线程的坏处及如何优雅地终止线程#xff0c;那么还有别的可以终止线程的方法吗#xff1f;答案是肯定的#xff0c;它就是我们今天要分享的——线程中断。
下面…转载自 一文搞懂 Java 线程中断
在之前的一文《如何优雅地终止一个线程》中详细说明了 stop 终止线程的坏处及如何优雅地终止线程那么还有别的可以终止线程的方法吗答案是肯定的它就是我们今天要分享的——线程中断。
下面的这断代码大家应该再熟悉不过了线程休眠需要捕获或者抛出线程中断异常也就是你在睡觉的时候突然有个人冲进来把你吵醒了。
try {Thread.sleep(3000);
} catch (InterruptedException e) {e.printStackTrace();
}此时线程被打断后代码会继续运行或者抛出异常结束运行这并不是我们需要的中断线程的作用。
到底是什么是线程中断
线程中断即线程运行过程中被其他线程给打断了它与 stop 最大的区别是stop 是由系统强制终止线程而线程中断则是给目标线程发送一个中断信号如果目标线程没有接收线程中断的信号并结束线程线程则不会终止具体是否退出或者执行其他逻辑由目标线程决定。
我们来看下线程中断最重要的 3 个方法它们都是来自 Thread 类
1、java.lang.Thread#interrupt
中断目标线程给目标线程发一个中断信号线程被打上中断标记。
2、java.lang.Thread#isInterrupted()
判断目标线程是否被中断不会清除中断标记。
3、java.lang.Thread#interrupted
判断目标线程是否被中断会清除中断标记。
线程中断实战
我们来实例演示下线程中断如何用
示例1中断失败
/*** 微信公众号Java技术栈*/
private static void test1() {Thread thread new Thread(() - {while (true) {Thread.yield();}});thread.start();thread.interrupt();
}请问示例1中的线程会被中断吗答案不会因为虽然给线程发出了中断信号但程序中并没有响应中断信号的逻辑所以程序不会有任何反应。
示例2中断成功
/*** 微信公众号Java技术栈*/
private static void test2() {Thread thread new Thread(() - {while (true) {Thread.yield();// 响应中断if (Thread.currentThread().isInterrupted()) {System.out.println(Java技术栈线程被中断程序退出。);return;}}});thread.start();thread.interrupt();
}我们给示例2加上了响应中断的逻辑程序接收到中断信号打印出信息后返回退出。
示例3中断失败
/*** 微信公众号Java技术栈*/
private static void test3() throws InterruptedException {Thread thread new Thread(() - {while (true) {// 响应中断if (Thread.currentThread().isInterrupted()) {System.out.println(Java技术栈线程被中断程序退出。);return;}try {Thread.sleep(3000);} catch (InterruptedException e) {System.out.println(Java技术栈线程休眠被中断程序退出。);}}});thread.start();Thread.sleep(2000);thread.interrupt();
}示例3 sleep() 方法被中断并输出了 Java技术栈线程休眠被中断程序退出。 程序继续运行……为什么呢
来看 sleep 的源码 可以看出 sleep() 方法被中断后会清除中断标记所以循环会继续运行。。
示例4中断成功
/*** 微信公众号Java技术栈*/
private static void test4() throws InterruptedException {Thread thread new Thread(() - {while (true) {// 响应中断if (Thread.currentThread().isInterrupted()) {System.out.println(Java技术栈线程被中断程序退出。);return;}try {Thread.sleep(3000);} catch (InterruptedException e) {System.out.println(Java技术栈线程休眠被中断程序退出。);Thread.currentThread().interrupt();}}});thread.start();Thread.sleep(2000);thread.interrupt();
}示例4全部信息输出并正常退出只是在 sleep() 方法被中断并清除标记后手动重新中断当前线程然后程序接收中断信号返回退出。