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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 请备注 中级黑马   /  2014-4-3 16:38  /  1251 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Ticket extends Thread
{
        private int tick = 100;
        public void run()
        {
            while(true)
            {
                if(tick>0)
                {
                System.out.println(currentThread().getName()+"sale: "+

tick--);
                }
            }
        }



}

class TicketDemo
{
        public static void main(String[] args)
        {
            Ticket t1 = new Ticket();
            Ticket t2 = new Ticket();
              Ticket t3 = new Ticket();
            Ticket t4 = new Ticket();

            t1.start();
            t2.start();
            t3.start();
            t4.start();
        }
}

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
本帖最后由 xietansheng 于 2014-4-3 17:05 编辑

你创建了四条没有共享数据独立线程,你这个卖票程序很多问题,比如同一数据源,线程安全问题等都没考虑,还出现死循环问题,票卖完了也不会退出循环。
在你的程序框架基础上进行了修改,如下:
  1. class Ticket extends Thread
  2. {
  3.         private static int tick = 100;        // 保证同一数据源
  4.         public void run()
  5.         {
  6.                 while(true)
  7.                 {
  8.                         synchronized(Ticket.class)        // 加同步锁,保证线程安全
  9.                         {
  10.                                 if(tick > 0)
  11.                                 {
  12.                                         System.out.println(currentThread().getName() + " sale: " + tick--);
  13.                                 }
  14.                                 else
  15.                                 {
  16.                                         break;                        // 票卖完了,需要退出循环
  17.                                 }
  18.                         }
  19.                         try
  20.                         {
  21.                                 Thread.sleep(100);        // 需要稍作休息,否则看不出效果
  22.                         }
  23.                         catch (Exception e)
  24.                         {
  25.                                 e.printStackTrace();
  26.                         }
  27.                 }
  28.         }

  29. }

  30. class TicketDemo
  31. {
  32.         public static void main(String[] args)
  33.         {
  34.                 Ticket t1 = new Ticket();
  35.                 Ticket t2 = new Ticket();
  36.                 Ticket t3 = new Ticket();
  37.                 Ticket t4 = new Ticket();

  38.                 t1.start();
  39.                 t2.start();
  40.                 t3.start();
  41.                 t4.start();
  42.         }
  43. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为每个线程start后,都会调用run方法,于是,就会每个线程都卖100张票。
于是就要加入同步代码块:
  1. class Ticket implements Runnable
  2. {
  3.         private  int tick = 1000;
  4.         Object obj = new Object();
  5.         public void run()
  6.         {
  7.                 while(true)
  8.                 {
  9.                         synchronized(obj)
  10.                         {
  11.                                 if(tick>0)
  12.                                 {
  13.                                         //try{Thread.sleep(10);}catch(Exception e){}
  14.                                         System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
  15.                                 }
  16.                         }
  17.                 }
  18.         }
  19. }


  20. class  TicketDemo2
  21. {
  22.         public static void main(String[] args)
  23.         {

  24.                 Ticket t = new Ticket();

  25.                 Thread t1 = new Thread(t);
  26.                 Thread t2 = new Thread(t);
  27.                 Thread t3 = new Thread(t);
  28.                 Thread t4 = new Thread(t);
  29.                 t1.start();
  30.                 t2.start();
  31.                 t3.start();
  32.                 t4.start();


  33.         }
  34. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马