如何优雅的停止一个线程
首先我们先了解下,线程是分为用户线程和守护线程的,
他们的区别就在:
用户线程当我们的主线程停止后,用户线程不会随着主线程停止。
守护线程当我们的主线程停止后,会跟随着主线程一起停止。
一般我们创建的都是用户线程,那守护线程有哪些呢,例如跟程序一起启动的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(); } }