zoukankan      html  css  js  c++  java
  • 如何优雅的停止一个线程

    首先我们先了解下,线程是分为用户线程和守护线程的,

    他们的区别就在:

      用户线程当我们的主线程停止后,用户线程不会随着主线程停止。

      守护线程当我们的主线程停止后,会跟随着主线程一起停止。

    一般我们创建的都是用户线程,那守护线程有哪些呢,例如跟程序一起启动的GC线程就是守护线程。

    停止线程的方法:

    1.Thread类的stop()方法,

    但是这个方法是已过期的,不推荐使用。

    因为在stop()方法的底层是强制停止线程的,就是不管它正在做什么,它都是二话不说就停掉的,所以很有可能会出现数据丢失等等的问题。

    2.手动抛出异常:

    这个也是比较好的解决办法。

    因为线程停止有两种方式,一种是程序有异常,自动停止。另一种就是run方法执行结束,线程停止。

    所以手动抛出异常,想在哪里停就在哪里停。

    3.使用条件判断让run()方法执行结束:

    上面说到当run()方法执行结束后,线程也会停止,所以我们只要让线程跑完run()方法就行了,也是很简单的思路。

    public class Thread005 extends Thread{
        private volatile boolean flag = true;//加volatile是为了保证他的可见性
    
        @Override
        public void run() {
            int i=1;
            while (flag){
                System.out.println(Thread.currentThread().getName()+"我是子线程"+i);
                if(i<10){
                    i++;
                }else{
                    chageFlag();
                }
            }
        }
        public void chageFlag(){
            this.flag = false;
        }
    
        public static void main(String[] args) {
            System.out.println(Thread.currentThread().getName()+"我是主线程");
            Thread thread = new Thread005();
            thread.start();
        }
    }
  • 相关阅读:
    Zabbix触发器支持的函数说明
    Zabbix Trigger表达式实例
    Nginx 504 Gateway Time-out问题解决
    题外话:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗
    Vim快捷键分类
    [转]运维工作解释
    Cobbler的Web管理和维护
    使用 Cobbler 自动化和管理系统安装
    NTP时间服务器
    自动化部署必备技能—搭建YUM仓库
  • 原文地址:https://www.cnblogs.com/LinTianwen/p/13376718.html
Copyright © 2011-2022 走看看