大家都知道,java里面有3种方法来停止线程:
1.run()方法执行完毕,自动退出。
2.使用stop方法来强行退出,但是不推荐使用这个方法,因为此方法已过期。
3.使用interrupt方法中断线程。
注意,我们推荐使用interrupt()方法来停止线程,但是单纯调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并没有真的停止线程。
下面来看一个例子:
MyThread类: public class MyThread extends Thread { public void run(){ super.run(); for(int i=0;i<500000;i++) { if (this.interrupted()) { System.out.println("线程已经是停止状态了,我要退出了"); break; } System.out.println("i="+(i+1)); } System.out.println("我在for的下面,如果我输出,那么就证明线程没有被停止!"); } }
test类: public class test { public static void main(String []args) { try{ MyThread thread=new MyThread(); thread.start(); Thread.sleep(2000); thread.interrupt(); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("end"); } }
输出为:
有上面可以得知,即使线程已经是停止状态(伪像),run()方法里面的句子还是会继续执行,为了解决这样的问题,我们使用了抛出异常的方法:
下面是一个例子:
MyThread类: public class MyThread extends Thread { public void run(){ super.run(); try{ for(int i=0;i<500000;i++) { if (this.interrupted()) { System.out.println("线程已经是停止状态了,我要退出了"); throw new InterruptedException(); } System.out.println("i="+(i+1)); } System.out.println("我在for的下面,如果我输出,那么就证明线程没有被停止!"); } catch (InterruptedException e){ System.out.println("进入MyThread.java类run方法中的catch了"); e.printStackTrace(); } } }
test类: public class test { public static void main(String []args) { try{ MyThread thread=new MyThread(); thread.start(); Thread.sleep(2000); thread.interrupt(); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("end"); } }
输出为:
达到了目的。
其实直接在run()方法里面通过return()来停止线程。但是代码中出现多个return之后会造成污染,所以不建议使用。
public class MyThread extends Thread{ public void run(){ while(true) { if(this.isInterrupted()) { return ; } } } }