在停止线程运行时有一种特殊情况,就是当线程处于了冻结状态时,就不会读取到while循环的标记,那么线程就不会结束。
如下代码:
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");
}
System.out.println(Thread.currentThread().getName()+"....run");
}
}
public void changeFlag()
{
flag = false;
}
}
class StopThreadDemo
{
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)
{
if(num++ == 60)
{
st.changeFlag();
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
System.out.println("over");
}
}
运行结果如下:
发现程序卡住了,主要是开辟的线程都进入到了 wait 状态。这时会有小伙伴说不是有 notify 吗,注意,这里除了主线程,其他线程都进入了 wait 状态,已经不能执行 notify 了。
所以,java提供了一个中断线程的方法:
Thread.interrupt()
样例代码如下:
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 StopThreadDemo
{
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)
{
if(num++ == 60)
{
// st.changeFlag();
t1.interrupt(); //中断线程t1
t2.interrupt(); //中断线程t2
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
System.out.println("over");
}
}