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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝义涛 中级黑马   /  2014-5-22 22:22  /  928 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class TicketRunnable implements Runnable
{
private int tick = 1000;

boolean flag = true;

public void setFlag(boolean flag)
{
  this.flag = flag;
}

public void run()
{
  show();
}


private  void show()
{
  if(flag)
  {
   
    while(true)
    {
     synchronized(TicketRunnable.class)
     {
      if(tick>0)
      {
       try{Thread.sleep(10);}catch(Exception e){}
       System.out.println("线程一:"+"..."+tick--);
     
      }
     }
    }
   
  }
  else
  {
   
    while(true)
    {
     synchronized(TicketRunnable.class)
     {
      if(tick>0)
      {
       try{Thread.sleep(10);}catch(InterruptedException e){}
       System.out.println("线程2:"+"..."+tick--);
     
      }
     }
    }
   
  }
}
}


public class TicketExe {

public static void main(String[] args)
{
  /*
  TicketDemo t1 = TicketDemo.getTicketDemo();
  TicketDemo t2 = TicketDemo.getTicketDemo();
  t1.start();
  t2.start();*/
  
  TicketRunnable t = new TicketRunnable();//如何区分这两个同步线程
  
  Thread t1 = new Thread(t);
  Thread t2 = new Thread(t);
  
  t1.start();
  try{Thread.sleep(15);}catch(Exception e){}
  t.setFlag(false);
  t2.start();
  
}
}

上面的程序多线程可以跑,运行正常,但是我把TicketRunnable类的锁位置稍微变一下,放在while循环的外面,多线程就跑不起来了,怎么回事?
大神求解!

锁放在while循环 的外面代码如下:
public class TicketRunnable implements Runnable
{
private int tick = 1000;

boolean flag = true;

public void setFlag(boolean flag)
{
  this.flag = flag;
}

public void run()
{
  show();
}


private  void show()
{
  if(flag)
  {
   synchronized(TicketRunnable.class)
   {
    while(true)
    {
     
      if(tick>0)
      {
       try{Thread.sleep(10);}catch(Exception e){}
       System.out.println("线程一:"+"..."+tick--);
     
      }
     }
    }
   
  }
  else
  {
   synchronized(TicketRunnable.class)
   {
    while(true)
    {
     
      if(tick>0)
      {
       try{Thread.sleep(10);}catch(InterruptedException e){}
       System.out.println("线程2:"+"..."+tick--);
     
      }
    }
   }
   
  }
}
}



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马