要想终止线程的运行,只有一种方法就是执行完run方法。
注意:stop方法强制终止线程容易引发安全隐患,不推荐使用。
interrupt可以清除线程的冻结状态(wait,sleep等)。
class StopThread implements Runnable{ private boolean flag = true; public void setFlag(boolean flag) { this.flag = flag; } @Override public synchronized void run() { while (flag){ try { wait(); } catch (InterruptedException e) { System.out.println(Thread.currentThread().getName()+"...Exception"); flag = false; } System.out.println(Thread.currentThread().getName()+"....run"); } } }
public class StopThreadDemo { public static void main(String[] args){ StopThread thread = new StopThread(); Thread t1 = new Thread(thread); Thread t2 = new Thread(thread); t1.start(); t2.start(); int num = 0; while (true){ if (num ++ == 60){ thread.setFlag(false); t1.interrupt(); t2.interrupt(); break; } System.out.println(Thread.currentThread().getName()+"......."+num); } System.out.println("over"); } }
守护线程:t1.setDaemon(true);//设置为守护线程,该方法必须在启动线程前调用。当正在运行的线程都是守护线程时,java虚拟机退出。
public class DaemonThread implements Runnable { @Override public void run() { int i = 0; while (i<1000){ System.out.println(Thread.currentThread().getName()+":"+i++); } } public static void main(String[] args){ DaemonThread thread1 = new DaemonThread(); DaemonThread thread2 = new DaemonThread(); Thread t1 = new Thread(thread1); Thread t2 = new Thread(thread2); t1.setDaemon(true); t1.start(); t2.start(); } }
结果如下
通过结果我们可以知道:当线程1运行完之后,线程0还没有运行完就已经结束了。