聊聊Java 中的线程中断

作者:chengco 时间:2021-05-31 02:04:30 

Java如何实现线程中断?

通过调用Thread类的实例方法interrupt。如下:


Thread thread = new Thread(){
     @Override
     public void run() {
       if(isInterrupted()){
         System.out.println("interrupt");
       }
     }
   };
   thread.start();

thread.interrupt();

线程中断后线程会立即停止执行吗?

NO。 而如果线程未阻塞,或未关心中断状态,则线程会正常执行,不会被打断。

Thread.interrupt()的官方解释是这样的:

If this thread is blocked in an invocation of the

Object#wait() wait(), { Object#wait(long) wait(long)}, or { Object#wait(long, int) wait(long, int)} methods of the { Object} class, or of the { #join()}, { #join(long)}, { #join(long, int)}, { #sleep(long)}, or { #sleep(long, int)}, methods of this class, then its interrupt status will be cleared and it will receive an { InterruptedException}.

也就是:处于阻塞的线程,即在执行Object对象的wait()、wait(long)、wait(long, int),或者线程类的join()、join(long)、join(long, int)、sleep(long)、sleep(long,int)方法后线程的状态,当线程调用interrupt()方法后,这些方法将抛出InterruptedException异常,并清空线程的中断状态。

比如下面的例子会中断两次,第一次sleep方法收到中断信号后抛出了InterruptedException,捕获异常后中断状态清空,然后继续执行下一次:


public static void main(String[] args) throws InterruptedException {
   Thread thread = new Thread(){
     @Override
     public void run() {
       try {
         Thread.sleep(10000);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }

System.out.println("interrupt");

try {
         Thread.sleep(10000);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
     }
   };
   thread.start();

thread.interrupt();
   Thread.sleep(5000);
   thread.interrupt();
 }

而下面这个例子则会一直执行,不会被打断:


public static void main(String[] args) throws InterruptedException {
   Thread thread = new Thread(){
     @Override
     public void run() {
       while (true)
       System.out.println("interrupt");
     }
   };
   thread.start();

thread.interrupt();
 }

interrupted与isInterrupted方法啥区别?

  • Thread类的静态方法interrupted:测试当前线程是否已经中断。如果线程处于中断状态返回true,否则返回false。同时该方法将清除的线程的中断状态。即:如果连续两次调用该方法,则第二次调用将返回false。该方法可用于清除线程中断状态使用。

  • Thread类的实例方法isInterrupted:测试线程是否已经中断。线程的中断状态不受该方法的影响。

Thread类并没有提供单独清除中断状态的方法,所以有两种方式来达到此目的:

  • 对于sleep等阻塞方法,catch InterruptedException异常;

  • 调用Thread类的静态方法interrupted

线程中断有哪些实际应用?

线程中断的几个实际应用场景:

  • 在处理Web请求时,可能将请求分配到多个线程去处理,实现请求执行的超时机制;

  • 实现线程池时,关闭线程池中的线程任务。

来源:https://juejin.im/post/6893456748171296781?utm_source=tuicool&utm_medium=referral

标签:Java,线程,中断
0
投稿

猜你喜欢

  • gson对象序列化的示例

    2023-11-25 08:54:28
  • Spring与Mybatis基于注解整合Redis的方法

    2022-09-19 09:19:56
  • C++高并发内存池的整体设计和实现思路

    2023-07-03 16:29:31
  • Springboot使用redis实现接口Api限流的示例代码

    2023-11-29 02:11:05
  • MyBatis-plus中的模糊查询解读

    2022-06-16 08:27:03
  • Java虚拟机JVM性能优化(三):垃圾收集详解

    2021-10-16 10:38:49
  • redis redisson 集合的使用案例(RList、Rset、RMap)

    2023-11-13 13:50:21
  • Java栈和基础队列的实现详解

    2023-07-02 05:36:59
  • spring mvc中@PathVariable / 带斜杠方式获取

    2022-09-15 04:47:27
  • Android TextView实现跑马灯效果的方法

    2023-07-30 20:44:12
  • Java使用Lettuce客户端在Redis在主从复制模式下命令执行的操作

    2023-11-28 21:38:19
  • 基于Java汇总Spock框架Mock静态资源经验

    2023-11-25 04:42:29
  • Android 微信摇一摇功能实现详细介绍

    2023-06-21 21:00:09
  • Java中的break和continue关键字的使用方法总结

    2022-07-13 11:50:46
  • 在Spring环境中正确关闭线程池的姿势

    2023-11-25 08:07:29
  • JPA多数据源分布式事务处理方案

    2023-08-09 03:50:06
  • Java读取.properties配置文件方法示例

    2023-08-24 16:32:56
  • 基于C语言实现井字棋游戏

    2023-06-28 21:23:18
  • 深入理解Javascript中的this关键字

    2022-03-08 16:52:25
  • java中的文件操作总结(干货)

    2023-11-08 22:24:29
  • asp之家 软件编程 m.aspxhome.com