美文网首页
线程的优雅关闭

线程的优雅关闭

作者: GavinZZW | 来源:发表于2021-03-25 23:48 被阅读0次

    1 stop与destory函数

    在Java中,有stop()、destory()等方法,但这些方法官方明确不建议使用。原因很简单,如
    果强制杀死线程,则线程中所使用的资源,例如文件描述符、网络连接等无法正常关闭。

    因此,一个线程一旦运行起来,不要强行关闭,合理的做法是让其运行完(也就是方法执行完
    毕),干净地释放掉所有资源,然后退出。如果是一个不断循环运行的线程,就需要用到线程间的通信
    机制,让主线程通知其退出。

    .2 守护线程

    daemon线程和非daemon线程的对比:

    public class Main {
        public static void main(String[] args) {
            MyDaemonThread myDaemonThread = new MyDaemonThread();
            // 将当前线程设置为daemon线程:守护线程
            myDaemonThread.setDaemon(true);
            myDaemonThread.start();
            MyThread myThread = new MyThread();
            myThread.start();
    
        }
    }
    
    public class MyDaemonThread extends Thread {
    
        @Override
        public void run() {
            while (true) {
                System.out.println("daemon线程。。。");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public class MyThread extends Thread {
    
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("非daemon线程");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    对于上面的程序,在thread.start()前面加一行代码thread.setDaemon(true)。当main(...)函数退出
    后,线程thread就会退出,整个进程也会退出。
    当在一个JVM进程里面开多个线程时,这些线程被分成两类:守护线程和非守护线程。默认都是非
    守护线程。
    在Java中有一个规定:当所有的非守护线程退出后,整个JVM进程就会退出。意思就是守护线程“不
    算作数”,守护线程不影响整个 JVM 进程的退出。
    例如,垃圾回收线程就是守护线程,它们在后台默默工作,当开发者的所有前台线程(非守护线
    程)都退出之后,整个JVM进程就退出了。

    3 设置关闭的标志位

    开发中一般通过设置标志位的方式,停止循环运行的线程。

        private boolean flag = true;
    
        @Override
        public void run() {
            while (flag) {
                System.out.println("线程正在运行。。。");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        // 用于关闭线程
        public void stopRunning() {
            this.flag = false;
        }
    

    但上面的代码有一个问题:如果MyThread t在while循环中阻塞在某个地方,例如里面调用了
    object.wait()函数,那它可能永远没有机会再执行 while( ! stopped)代码,也就一直无法退出循环。
    此时,就要用到InterruptedException()与interrupt()函数来中断线程。

    相关文章

      网友评论

          本文标题:线程的优雅关闭

          本文链接:https://www.haomeiwen.com/subject/gpydhltx.html