要想终止线程的运行,只有一种方法就是执行完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还没有运行完就已经结束了。