黑马程序员技术交流社区

标题: 停止线程,纠结一上午 [打印本页]

作者: 邹海洋    时间: 2012-11-2 15:08
标题: 停止线程,纠结一上午
本帖最后由 邹海洋 于 2012-11-3 08:25 编辑

class StopThread implements Runnable
{
private boolean flag = true;
public synchronized void run()
{
  while (flag)   
  {
   try
   {
    wait();   //1.线程0进来,就挂在这里了
   }//线程1不是就进不来了吗?怎么老师讲的t1,t2都挂这了?
   catch (InterruptedException e)
   {
   }
   System.out.println(Thread.currentThread()
    .getName()+"....run");
  }
}
public void change()
{
  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++ == 100)
   {
    st.change();
    break;
   }
   System.out.println(Thread.currentThread().
    getName()+".....'.....main"+num);
  }
}
}


作者: 刘士林    时间: 2012-11-2 15:51
因为线程有五种状态,当线程执行到wait()语句后就会放弃执行资格,不再去抢夺CPU的执行权,进入另一种状态即冻结状态,同时它也把锁释放,所以线程0进来挂这后,线程1还能进来,也挂这了。除非有notify()将它唤醒,否则一直挂这。
希望能对你有点帮助。
作者: 朱宏青    时间: 2012-11-2 15:55
?都是通一一个类里的程序 当然都挂在一个地方。

双线程 = 2个程序,为什么不能同时执行?除非你在里面加了锁 限制了一个程序只能开一个线程,那么第二个线程自然会被中止。

有点看不太懂你在纠结什么
作者: 焦晨光    时间: 2012-11-2 16:02
楼主不必纠结,wait()方法会把线程挂起,同时释放锁。
而sleep(),也会停止线程,但是不会释放锁!~~望采纳!~
作者: 邹海洋    时间: 2012-11-3 08:20
刘士林 发表于 2012-11-2 15:51
因为线程有五种状态,当线程执行到wait()语句后就会放弃执行资格,不再去抢夺CPU的执行权,进入另一种状态 ...

原来冻结状态会释放锁。这就通了。谢了 呵呵 看来看视频还是不够仔细啊 。
作者: 邹海洋    时间: 2012-11-3 08:20
焦晨光 发表于 2012-11-2 16:02
楼主不必纠结,wait()方法会把线程挂起,同时释放锁。
而sleep(),也会停止线程,但是不会释放锁!~~望采纳 ...

原来冻结状态会释放锁。这就通了。谢了 呵呵 看来看视频还是不够仔细啊 。
作者: 邹海洋    时间: 2012-11-3 08:21
qwepoidjdj 发表于 2012-11-2 15:55
?都是通一一个类里的程序 当然都挂在一个地方。

双线程 = 2个程序,为什么不能同时执行?除非你在里面加 ...

同步的run函数里不是已经上锁了吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2