/**
* stop方法已经过时
* 如何停止线程呢?
* 只有一种,run方法结束。开启多线程运行,运行代码通常是循环结构
* 只要控制住循环,就可以让run方法结束,也就是线程结束
*
*/
public class StopThreadDemo {
public static void main(String[] args) {
StopThread st=new StopThread();
Thread t1=new Thread(st);
Thread t2=new Thread(st);
/**
* 添加守护线程(后台线程)
* 前台线程已结束,后台线程自动结束
*/
t1.setDaemon(true);
t2.setDaemon(true);
t1.start();
t1.start();
int num=0;
while (true) {
if (num++==60) {
st.changFlag();
break;
}
System.out.println(Thread.currentThread().getName()+"..........."+num);
}
}
}
class StopThread implements Runnable{
private boolean flag=true;
@Override
public synchronized void run() {
/*当添加synchronized方法后容易产生冻结状态
* 当线程处于冻结状态就不会读取到标记,那么线程就不会结束
* 使用interrupt可以强行终结冻结状态一次,但是还是要进入冻结状态
* 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。
* 强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束。
* Thread类提供该方法interrupt();
*/
while (flag ) {
try {
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()+"....Exception");
flag=false;
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"....run");
}
}
public void changFlag() {
flag=false;
}
}