线程中断方法

Posted 听风者-better

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程中断方法相关的知识,希望对你有一定的参考价值。

线程中断方法

  • Thread.interrupt():中断线程。这里的中断线程并不会立即停止线程,而是设置线程的中断状态为true(默认是flase);
  • Thread.interrupted():测试当前线程是否被中断。线程的中断状态受这个方法的影响,意思是调用一次使线程中断状态设置为true,连续调用两次会使得这个线程的中断状态重新转为false;
  • Thread.isInterrupted():测试当前线程是否被中断。与上面方法不同的是调用这个方法并不会影响线程的中断状态。

直接通过interrupt方法中断线程

public static void main(String[] args) throws InterruptedException 
    Thread thread = new Thread(() -> 
        System.out.println("线程启动了");
        for (int i = 0; i < 1000; i++) 
            System.out.println(i);
        
        System.out.println("线程结束了");
    );
    thread.start();
    Thread.sleep(1L);
    thread.interrupt();

输出结果:

线程启动了
0
1
2
3
4
...
98
99
线程结束了

直接使用interrupt方法,线程也是执行完代码后正常退出

通过interrupt方法+isInterrupted()中断线程

public static void main(String[] args) throws InterruptedException 
    Thread thread = new Thread(() -> 
        System.out.println("线程启动了");
        for (int i = 0; i < 100; i++) 
            System.out.println(i);
            //添加线程状态判断,跳出循环
            if (Thread.currentThread().isInterrupted()) 
                break;
            
        
        System.out.println("线程结束了");
    );
    thread.start();
    Thread.sleep(1L);
    thread.interrupt();

线程启动了
0
1
2
3
...
22
23
24
25
26
线程结束了

interrupted()方法

public static void main(String[] args) throws InterruptedException 
    Thread thread = new Thread(() -> 
        System.out.println("线程启动了");
        for (int i = 0; i < 100; i++) 
            System.out.println(i);
            //添加线程状态判断,跳出循环
            if (Thread.currentThread().isInterrupted()) 
                System.out.println("当前线程:" + Thread.currentThread().getName() + " 第一次interrupted():" + Thread.currentThread().interrupted());
                System.out.println("当前线程:" + Thread.currentThread().getName() + " 第二次interrupted():" + Thread.currentThread().interrupted());
                break;
            
        
        System.out.println("线程结束了");
    , "t1");
    thread.start();
    Thread.sleep(1L);
    thread.interrupt();
    //设置主线程中断
    Thread.currentThread().interrupt();
    System.out.println("当前线程:" + Thread.currentThread().getName() + " 第一次interrupted():" + Thread.currentThread().interrupted());
    System.out.println("当前线程:" + Thread.currentThread().getName() + " 第二次interrupted():" + Thread.currentThread().interrupted());

输出结果

线程启动了
0
1
...
16
当前线程:t1 第一次interrupted():true
当前线程:main 第一次interrupted():true
当前线程:main 第二次interrupted():false
当前线程:t1 第二次interrupted():false
线程结束了

以上是关于线程中断方法的主要内容,如果未能解决你的问题,请参考以下文章

Thread的中断机制(interrupt),循环线程停止的方法

中断了吗?interruptinterrupted isInterrupted 区别

中断线程

线程中断:Thread类中interrupt()interrupted()和 isInterrupted()方法详解

Java 中 interrupted 和 isInterrupted 方法的区别?

Java 中 interrupted 和 isInterrupted 方法的区别?