线程停止的方法:
记住一点,线程的停止,
1.自己运行完了,
2.如果是无限循环,在外部,只能用flag标记来操作。
但是当线程处于冻结状态(阻塞),sleep,wait,join,(这三个方法抛出异常。)
就不会读取到flag.
这个时候,我们要清除线程的冻结状态,让它回到运行中。
如果,线程没有使之冻结的语句,则,inierrupt()不进行任何操作。
interrupt()方法,会使sleep,wait,jion方法抛出异常。
然后,我们在处理异常的语句中来操作。
我推荐的方式:不在catch中改变标记,
还是调用改变标记的方法,然后,跟上interrupt.
st.changeFlag();
t1.interrupt();
这样,无论线程中,有没有受阻塞的方法,都会停止线程。
class StopThread implements Runnable
{
private boolean flag=true;
public void run()
{
while(flag)
{
synchronized(this)
{
try
{
wait();
}
catch (Exception e)
{
System.out.println(Thread.currentThread().getName()+"...Exception");
flag=false;
}
}
}
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++==10000)
{
//st.changeFlag();
t1.interrupt();
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+"....."+num);
}
}
}