interrupted() 和 isInterrupted() 详述,百万数据分页查询的方法及其优化方式
}
}
interrupt0();
}
/**
测试当前线程是否被中断,返回中断标志
*/
public static boolea 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 n interrupted() {
return currentThread().isInterrupted(true);
}
/**
测试当前线程是否被中断,返回中断标志
*/
public boolean isInterrupted() {
return isInterrupted(false);
}
/**
线程是否被中断 native 方法,ClearInterrupted 为是否清除中断标志参数
*/
private native boolean isInterrupted(boolean ClearInterrupted);
/**
中断当前线程的 native 方法
*/
private native void interrupt0();
?
[](()interrupted()和 isInterrupted()区别
看了上述 API 讲述和 Thread 中的源码,已经清楚 interrupted()和 isInterrupted()的主要区别了
interrupted()为静态方法,isInterrupted()为普通方法
interrupted() 返回中断标志且清除(恢复)中断标志,isInterrupted()仅返回中断标志
?
使用方法
我们先验证中断异常响应,通过如下两种方法的使用示例来介绍,注意 Runner 中的 run 方法的部分区别
方法一
package com.liziba.p7;
import java.util.concurrent.TimeUnit;
/**
<p>
</p>
@Author: Liziba
@Date: 2021/6/24 21:05
*/
public class ThreadInterruptedDemo {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runner(), "Thread-01");
t1.start();
// 主线程睡眠 1 秒,保证 t1 的充分执行
TimeUnit.SECONDS.sleep(1);
// 发起中断
t1.interrupt();
}
static class Runner implements Runnable {
@Override
public void run() {
while (!Thread.cur Java 开源项目【ali1024.coding.net/public/P7/Java/git】 rentThread().isInterrupted()) {
System.out.println(Thread.currentThread().getName() + " is running .");
}
}
}
}
输出结果
可以看到线程在执行数次后终止运行
?
方法二
package com.liziba.p7;
import java.util.concurrent.TimeUnit;
/**
<p>
</p>
@Author: Liziba
@Date: 2021/6/24 21:18
*/
public class ThreadInterruptedDemo {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runner(), "Thread-01");
t1.start();
// 主线程睡眠 2 秒,保证 t1 的充分执行
TimeUnit.SECONDS.sleep(1);
// 发起中断
t1.interrupt();
}
static class Runner implements Runnable {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println(Thread.currentThread().getName() + " is running .");
try {
// 睡眠 2 秒,保证主线程发起的中断能被捕获
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
// 不对中断做任何处理,try 住异常,打印
e.printStackTrace();
}
}
}
}
}
?
输出结果
可以看到 main 线程中发起的 t1 线程中断,被捕获住异常后,未做任何处理,线程继续持续不断的运行
总结上述两种方式
方法一和方法二,均通过判断 Thread.currentThread().isInterrupted()的值来运行 run 方法中的逻辑,Thread.currentThread().isInterrupted()在线程未中断时返回 false,当 main 线程中执行 t1.interrupt()时,线程 t1 被中断,Thread.currentThread().isInterrupted()的值变为 false;在方法一中,获取到这个变化后直接结束运行;在方法二中,由于 sleep()使得线程阻塞会响应中断,但是此时我仅仅 catch 住异常,并没有对中断做任何处理,这里有个知识点是,线程响应中断抛出异常时,会恢复(清除)中断标志,所以 t1.interrupt()对中断标志的修改又被恢复了,程序仍然不断的运行。
?
接下来我们来验证 interrupted()对于中断的标志的清除
package com.liziba.p7;
import java.util.concurrent.TimeUnit;
/**
那么如何才能正确的掌握 Redis 呢?
为了让大家能够在 Redis 上能够加深,所以这次给大家准备了一些 Redis 的学习资料,还有一些大厂的面试题,包括以下这些面试题
并发编程面试题汇总
JVM 面试题汇总
Netty 常被问到的那些面试题汇总
Tomcat 面试题整理汇总
Mysql 面试题汇总
Spring 源码深度解析
Mybatis 常见面试题汇总
Nginx 那些面试题汇总
Zookeeper 面试题汇总
RabbitMQ 常见面试题汇总
JVM 常频面试:
Mysql 面试题汇总(一)
Mysql 面试题汇总(二)
Redis 常见面试题汇总(300+题)
评论