黑马程序员技术交流社区
标题:
中断线程问题?
[打印本页]
作者:
高鑫
时间:
2012-5-23 02:02
标题:
中断线程问题?
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");
//setFlag();
}
System.out.println(Thread.currentThread().getName()+".....");
}
}
public void setFlag()
{
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.setDaemon(true);
//t2.setDaemon(true);//将两个线程全标记成后台线程。
t1.start();
t2.start();
int num = 1;
while(true)
{
if(num++==50)
{
t1.interrupt(); // (1)
t2.interrupt(); // (2)
st.setFlag(); // (3)
break;
}
System.out.println(Thread.currentThread().getName()+"....."+num);
}
}
}
复制代码
这个是老师视频里的例题,我把(3)改动到1和2的下面,并把抛出异常中的setFlag();注释掉,按我的理解1,2,3是按顺序执行的,当程序执行到我注释的1,2的地方时,按我的理解是t1和t2线程结束冻结状态,抛出异常,打印
System.out.println(Thread.currentThread().getName()+".....")语句后,这时又循环到了wait语句,再次冻结。这时运行3, 改变标记,但是 t1和t2还是在冻结
冻结状态的啊,为什么程序能结束呢?
作者:
林豪
时间:
2012-5-23 02:17
你线程一运行就都wait了,然后主线程到50之后就读 while(true)
{
if(num++==50)
{
t1.interrupt(); // (1)
t2.interrupt(); // (2)
st.setFlag(); // (3)
break;
}
这句了,那顺序下来读到break就跳出循环主线程就结束了,虚拟机也就关掉了,那当然2全部停掉了呗
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2