线程的中断和守护

线程中断概述

线程的鲁莽关闭会导致资源无法释放,为了解决这个问题,JDK提供了一个interrupt()方法实现线程的中断。

interrupt()方法

为想要关闭的线程打上标记,将会抛出一个异常对象进入catch块中。

下面用一个案例展示interrupt()方法的使用:
首先创建一个实现Runnable接口的类,用于创建线程。

class RunnableDemo implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
            try {
                Thread.sleep(1000);//指定休眠1秒
            } catch (InterruptedException e) {
                System.out.println("发现中断标记,但未做任何处理");
            }
        }
    }

}

接着在程序运行入口代码如下:

    public static void main(String[] args) throws InterruptedException {
        //子线程开启
        Thread t1 = new Thread(new RunnableDemo());
        t1.start();
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
            Thread.sleep(1000);
        }

        //给线程t1添加中断标记
        t1.interrupt();
    }

运行结果如下:

main:0
Thread-0:0
main:1
Thread-0:1
Thread-0:2
main:2
Thread-0:3
main:3
Thread-0:4
main:4
Thread-0:5
发现中断标记,但未做任何处理
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9

主线程中for循环执行完成后,才会调用interrupt()方法给子线程t1打上标记,打上标记后运行sleep()方法时会判断是否有中断标记,如果有则抛出异常对象到catch代码块中。如果有释放资源的需求,在catch代码块中添加"用于资源释放的代码"即可。


线程类型概述:

线程分为用户线程和守护线程。当一个进程中不包含任何用户线程时,进程结束。当最后一个用户线程结束时,所有守护线程自动结束。默认创建的线程为用户线程。

运行下面这段代码

public class ThredDemo {
    public static void main(String[] args) throws InterruptedException {
        //子线程开启
        Thread t1 = new Thread(new RunnableDemo());
        t1.start();
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
            Thread.sleep(1000);
        }
    }

}
class RunnableDemo implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
            try {
                Thread.sleep(1000);//指定休眠1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

运行结果如下:

Thread-0:0
main:0
main:1
Thread-0:1
main:2
Thread-0:2
Thread-0:3
main:3
Thread-0:4
main:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9

我们会发现:

即时主线程死亡,子线程也不会结束。

现在我们使用setDaemon()方法将子线程对象t1设置为守护线程:

    public static void main(String[] args) throws InterruptedException {
        //子线程开启
        Thread t1 = new Thread(new RunnableDemo());
        t1.setDaemon(true);//将t1设置为守护线程
        t1.start();
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
            Thread.sleep(1000);
        }
    }

运行结果如下:

Thread-0:0
main:0
Thread-0:1
main:1
main:2
Thread-0:2
main:3
Thread-0:3
Thread-0:4
main:4
Thread-0:5

我们可以看出,设置守护线程后,主线程死亡,守护线程也死亡了。

posted on 2021-10-25 20:37  技术小伙伴  阅读(86)  评论(0)    收藏  举报