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();
        }
    }
  • 相关阅读:
    LeetCode15 3Sum
    LeetCode10 Regular Expression Matching
    LeetCode20 Valid Parentheses
    LeetCode21 Merge Two Sorted Lists
    LeetCode13 Roman to Integer
    LeetCode12 Integer to Roman
    LeetCode11 Container With Most Water
    LeetCode19 Remove Nth Node From End of List
    LeetCode14 Longest Common Prefix
    LeetCode9 Palindrome Number
  • 原文地址:https://www.cnblogs.com/LinTianwen/p/13376718.html
Copyright © 2011-2022 走看看