A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邹海洋 中级黑马   /  2012-11-2 15:08  /  2023 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邹海洋 于 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);
  }
}
}

6 个回复

倒序浏览
因为线程有五种状态,当线程执行到wait()语句后就会放弃执行资格,不再去抢夺CPU的执行权,进入另一种状态即冻结状态,同时它也把锁释放,所以线程0进来挂这后,线程1还能进来,也挂这了。除非有notify()将它唤醒,否则一直挂这。
希望能对你有点帮助。
回复 使用道具 举报
?都是通一一个类里的程序 当然都挂在一个地方。

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

有点看不太懂你在纠结什么
回复 使用道具 举报
楼主不必纠结,wait()方法会把线程挂起,同时释放锁。
而sleep(),也会停止线程,但是不会释放锁!~~望采纳!~
回复 使用道具 举报
刘士林 发表于 2012-11-2 15:51
因为线程有五种状态,当线程执行到wait()语句后就会放弃执行资格,不再去抢夺CPU的执行权,进入另一种状态 ...

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

原来冻结状态会释放锁。这就通了。谢了 呵呵 看来看视频还是不够仔细啊 。
回复 使用道具 举报
qwepoidjdj 发表于 2012-11-2 15:55
?都是通一一个类里的程序 当然都挂在一个地方。

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

同步的run函数里不是已经上锁了吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马