写点什么

interrupted() 和 isInterrupted() 详述,百万数据分页查询的方法及其优化方式

  • 2022 年 4 月 22 日
  • 本文字数:1709 字

    阅读完需:约 6 分钟

}


}


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()的主要区别了


  1. interrupted()为静态方法,isInterrupted()为普通方法

  2. 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+题)



用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
interrupted()和isInterrupted()详述,百万数据分页查询的方法及其优化方式_Java_爱好编程进阶_InfoQ写作社区