Java控制子线程的退出

存在监控线程,日志线程等需要同主线程一同存在与退出,那么如何在主线程退出前正确优雅的结束这些子线程?
因为stop方法(以及用于暂停的suspend)都不能释放资源而导致死锁等问题已经弃用,这里只讨论优雅的退出方式。

共享变量控制法

import java.util.concurrent.TimeUnit;

public class TerminationThread {
    private volatile boolean run;

    public void start(){
        run = true;
        new Thread(() -> {
            while (run) {
                try {
                    System.out.println("处理事务");
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("结束前后续处理步骤");
        }).start();
    }

    public void stop(){
        run = false;
    }

    public static void main(String[] args) throws InterruptedException {
        TerminationThread terminationThread = new TerminationThread();
        terminationThread.start();
        TimeUnit.SECONDS.sleep(5);
        terminationThread.stop();

    }
}

打断(interrupt)的方法

import java.util.concurrent.TimeUnit;

public class TerminationThread3 {
    private Thread t;

    public void start() {
        t = new Thread(() -> {
            while (true) {
                if (t.isInterrupted()) {
                    System.out.println("结束前后续处理步骤");
                    break;
                }
                try {
                    System.out.println("处理事务");
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    t.interrupt();//睡眠中被打断会清楚打断标记,这里补上标记让下个循环开始退出
                }
            }

        }, "t");
        t.start();
    }

    public void stop() {
        t.interrupt();
    }

    public static void main(String[] args) throws InterruptedException {
        TerminationThread3 terminationThread3 = new TerminationThread3();
        terminationThread3.start();
        TimeUnit.SECONDS.sleep(5);
        terminationThread3.stop();
    }
}

守护线程(没有办法释放资源,但可以让子线程随主线程一同结束,可以容忍后续步骤不完成的情况下使用)

import java.util.concurrent.TimeUnit;

public class TerminationThread2 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (true) {
                try {
                    System.out.println("处理事务");
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.setDaemon(true);
        t.start();

        TimeUnit.SECONDS.sleep(5);
    }
}

你可能感兴趣的:(Java控制子线程的退出)