黑马程序员技术交流社区
标题:
如何结束线程?
[打印本页]
作者:
醉演星松
时间:
2015-7-22 23:58
标题:
如何结束线程?
如何停止线程?
过去用stop不过现在已经过时
我们知道。开启多线程运行,运行代码通常是循环结构
所以只要控停止循环,就可以让run方法结束,也就是线程结束
特殊情况是:
当线程处于了冻结状态,
线程由于处于冻结状态,并读不到标记,那么线程就不会结束
当没有指定的方式让冻结的线程恢复到运行状态中来的时候,就需要对冻结进行解除!
解决是:
Thread类提供了该方法 interrupt();
该方法可以解除wait(),sleep();join()
class Test implements Runnable
{
private boolean flag = true;
//public void run()不加同步,没有changeFlag()方法,就只有线程0和线程1在交替执行,死循环,,,没有到main线程
//public void run()不加同步,有changeFlag()方法,线程0和线程1,mian线程交替执行。正常结束
public synchronized void run()//加上同步,其实只有一个线程在运行run()里面的内容,threa0和main线程交替,正常结束
//因为线程同步。里面又是条件总是满足的循环(直到changeFlag()执行)
{
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 InterruptThread
{
public static void main(String[] args)
{
Test t = new Test();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
int num =0;
while(true)
{
if(num++ == 6000)
{
t1.interrupt();
t2.interrupt();
//t.changeFlag();
break;
}
System.out.println(Thread.currentThread().getName()+num);
}
}
}
/*解析:
//run()方法同步,拥有changeFlag()功能,且有wait()操作,这时候,即使有changeFlag().无法正常结束
//因为Thread0执行,判断flag(true),进入wait状态,(重点)然后释放锁,thread1获得执行
//thread1执行,判断flag(true),进入wait状态,此时thread0和thread1都处于wait(冻结)状态。
//两个线程都是一开始就被wait了,还没来得及知道flag的值已经变化
//也就是说,两个线程都已是wait状态,即使后来改变了flag的值,因为冻结在那里,无法动,仍无法正常结束
怎样才能正常结束?
方法一(自己想的,哈哈)
这时候就需要interrupt()强行唤醒wait。先打破wait状态,在改变flag的值就可以正常结束
在main线程中的这几行代码即可
if(num++ == 6000)
{
t1.interrupt();
t2.interrupt();
t.changeFlag();
break;
}
方法二:
还是先打破wait状态,然后在catch中将flag直接赋值false
run()里面:
catch (InterruptedException e)
{
System.out.println(Thread.currentThread().getName()+"**exception");
flag = false;
}
mian线程:
if(num++ == 6000)
{
t1.interrupt();
t2.interrupt();
break;
}
其实都一样,都是先打破wait,然后或者在catch处理的时候将置flag为false
或者在mian里面单独处理!
*/
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2