-
为什么stop被放弃了:因为stop里面有一些bug!!
- image.png
-
如何停止线程?
-
只有一种Run方法结束。(使用interrupt(中断)方法!该方法时结束线程的冻结状态,使线程回到运行状态来。)
-
开启线程运行,运行代码通常是循环结构。
-
只要控制好线程就能让Run方法结束。
-
-
一般情况:
class StopThread implements Runnable{
private boolean flag = true;
public void run(){
while(flag){
System.out.println(Thread.currentThread().getName()+".....run");
}
}
public void changeFlag(){ //改变锁中线程的标志位,以达到终止线程的作用。
flag = false;
}
}
class StopDemo{
public static void main(String[] args){
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true){
num++;
if(num == 10){
st.changeFlag(); //中断线程!
break; //退出程序!
}
System.out.println(Thread.currentThread().getName()+".............."+num); //显示主线程的运行状况。
}
}
}
-
运行结果:
- image.png
-
特殊情况:
- 当线程处于了冻结状态,就不会读取标记,那么线程就不会结束。
-
当没有指定方式让冻结线程恢复到运行状态时,这时想要对线程进行冻结线程进行清除。
- 强制让冻结线程恢复到运行状态中来,这样就可以让线程操作标记让线程结束。
-
代码:
//特殊情况!!!同步!当线程处于了冻结状态,就不会读区标记,就不会结束线程
//解决办法:InterruptedException,如果用循环停止线程,wait(),sleep()就是异常!
class StopThread implements Runnable{
private boolean flag = true;
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 void changeFlag(){
flag = false;
}
}
class StopDemo{
public static void main(String[] args){
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true){
num++;
if(num == 100){
//st.changeFlag();
t1.interrupt(); //中断线程t1,
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+".............."+num);
}
}
}
-
结果:
- image.png
-
Interrupt( ) :
- image.png
网友评论