Java设置守护线程和用户线程、isAlive方法、interrupt方法、interrupted方法和isInterrupted方法以及优雅结束正在执行的线程


参考文章: Thread类中interrupt()、interrupted()和isInterrupted()方法详解
Java线程可以分为两类:用户线程和守护线程。
(1)通过线程对象.setDaemon(false)设置为用户线程。
(2)通过线程对象.setDaemon(true)设置为守护线程。设置守护线程时,必须在线程调用start方法之前调用setDaemon(true)方法,否则会抛出一个IllegalThreadStateException异常。
如果没有调用setDaemon方法,默认为用户线程。

用户线程和守护线程的区别

(1)主线程结束后用户线程还会继续运行,JVM存活。
(2)如果没有用户线程存活,都是守护线程,那么JVM结束。
(3)守护线程优先级比较低,用于为系统中其他对象和线程提供服务,不能操作文件、数据库等资源,所有为用户线程服务,而不涉及资源的线程都能设置为守护线程。
(4)垃圾回收线程是经典的守护线程。

interrupt方法、interrupted方法和isInterrupted方法区别

(1)线程对象.interrupt方法:给线程设置中断标志为中断状态,但线程并不会中断,仍会继续执行,需要检查标志位后通过代码实现来中断。
(2)Thread.interrupted方法:interrupted方法是Thread类的静态方法,用于检查当前线程的中断标志是否为中断状态,如果是则返回true,并清除中断标志的中断状态,第二次再调用interrupted方法时中断状态已经在第一次调用时被清除,将返回一个false。
(3)线程对象.isInterrupted方法:检查此线程的中断标志是否为中断状态,如果处于中断状态则返回true,但不清除中断状态。

强烈注意: 线程对象调用interrupt方法后,线程并不会中断,但如果线程对象处于Sleep状态,会立即抛出java.lang.InterruptedException中断异常。

class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread.currentThread().interrupt();
        System.out.println("第一次调用Thread.currentThread().interrupt():" + Thread.currentThread().isInterrupted());
        System.out.println("第一次调用thread.interrupted():" + Thread.interrupted());
        System.out.println("第二次调用thread.interrupted():" + Thread.interrupted());
    }
}

在这里插入图片描述

isAlive方法

  • 线程对象.isAlive方法用于测试线程是否处于活跃状态,即run方法是否还在运行,返回true表示run方法还没执行结束。
  • 如果想实现当前线程A执行完成后另一个线程B才继续执行,只需要在另一个线程B中通过当前线程A调用join方法即可。
class Main {
    public static void main(String[] args) {
        Thread thread = Thread.currentThread();
        thread.interrupt();
        System.out.println("第一次调用thread.isInterrupted():" + thread.isInterrupted());
        System.out.println("第二次调用thread.isInterrupted():" + thread.isInterrupted());
        //测试interrupted()函数
        System.out.println("第一次调用Thread.interrupted():" + Thread.interrupted());
        System.out.println("第二次调用Thread.interrupted():" + Thread.interrupted());
        //执行interrupt方法后发现线程仍然是alive的
        System.out.println("thread是否存活:" + thread.isAlive());
    }
}

在这里插入图片描述

优雅结束正在执行的线程

判断中断标志位是否为中断状态,如果是,则停止当前线程

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 500000; i++) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("线程中断");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    break;
                }
            }
        });
        thread.start();
        thread.interrupt();
        System.out.println("执行Thread对象.interrupt()后:" + thread.isInterrupted());
        System.out.println("执行Thread.interrupted()时:" + Thread.interrupted());
        System.out.println("执行Thread.interrupted()后:" + thread.isInterrupted());
    }
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页