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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李征雪 于 2012-4-6 08:01 编辑

毕老师第11天视频中卖票的程序
  1. class Ticket extends Thread
  2. {
  3.         public static int tick = 100;//定义一个共享的票数;
  4.         Ticket(String name)
  5.         {
  6.                 super(name);
  7.         }
  8.         public void run()
  9.         {
  10.                 while(tick > 0)
  11.                 {
  12.                         System.out.println(Thread.currentThread().getName()+"buy:"+tick);
  13.                         tick--;//每次减一张票
  14.                 }
  15.         }
  16. }

  17. class Demo1107
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 Ticket t1 = new Ticket("tttt");
  22.                 Ticket t2 = new Ticket("xxxx");

  23.                 t1.start();
  24.                 t2.start();
  25.                 System.out.println("Hello World!");
  26.         }
  27. }
复制代码
运行结果:


为什么我的第100张票卖了两次?
其它的都是次,是不是哪写错了?

9 个回复

倒序浏览

class Ticket implements Runnable

{

        public static int tick = 100;//定义一个共享的票数;

      

        public void run()

        {

                while(tick > 0)

                {

                        System.out.println(Thread.currentThread().getName()+"buy:"+tick);

                        tick--;//每次减一张票

                }

        }

}


public class Demo1107
{

        public static void main(String[] args)
        {

              //  Ticket t1 = new Ticket("tttt");

              //  Ticket t2 = new Ticket("xxxx");
                Thread t1=new Thread(new Ticket());
                Thread t2=new Thread(new Ticket());
                t1.start();

                t2.start();

                System.out.println("Hello World!");

        }

}
这样就可以了
回复 使用道具 举报
你那是线程同步了
回复 使用道具 举报

class Ticket extends Thread

{

        public static int tick = 100;//定义一个共享的票数;

       public Ticket(String name)
       {
               super(name);
       }

        public void run()

        {

                while(tick > 0)

                {
                     synchronized(Ticket.class)
                     {
                             System.out.println(Thread.currentThread().getName()+"buy:"+tick);
                             
                         tick--;//每次减一张票
                     }
                        

                }

        }

}


public class Demo1107
{

        public static void main(String[] args)
        {

                Ticket t1 = new Ticket("tttt");

                Ticket t2 = new Ticket("xxxx");
              //  Thread t1=new Thread(new Ticket());
                //Thread t2=new Thread(new Ticket());
                t1.start();

                t2.start();

                System.out.println("Hello World!");

        }

}
回复 使用道具 举报
我这运行还是不对啊,这个是不是和双核处理器有关啊,先去看视频,看看以后有没有这个的解决办法。
回复 使用道具 举报
没关系,往下面看吧,要用同步解决的
回复 使用道具 举报
这需要用到线程同步,如下:
{
        public static int tick = 100;//定义一个共享的票数;
        Ticket(String name)
        {
                super(name);
        }
        public void run()
        {
        synchronized(Ticket.class)
        {
                        while(tick > 0)
                        {
                                  System.out.println(Thread.currentThread().getName()+"buy:"+tick);
                                        tick--;//每次减一张票
                        }
        }
        }
}

class Demo1107
{
        public static void main(String[] args)
        {
                Ticket t1 = new Ticket("tttt");
                Ticket t2 = new Ticket("xxxx");

                t1.start();
                t2.start();
                System.out.println("Hello World!");
        }
}
回复 使用道具 举报
class Ticket extends Thread

{

        public static int tick = 100;//定义一个共享的票数;

        Ticket(String name)

        {

                super(name);

        }

        public void run()

        {

                while(tick > 0)

                {
                                       

                        System.out.println(Thread.currentThread().getName()+"buy:"+tick);
                                                /*
                                                线程启动后,t1线程执行到这段代码后停止,而此时cpu执行权交给了t2线程也执行完以上
                                                代码,此时共享数据tick并未自减,所以会打印出两张100的票。
                                                同理,打印出两张任意大于零的同数票都有可能,由于线程的执行权是由cpu交赋的,
                                                甚至会出现一张为1,一张为0。

                                                */

                        tick--;//每次减一张票

                }

        }

}



class Demo1107

{

        public static void main(String[] args)

        {

                Ticket t1 = new Ticket("tttt");

                Ticket t2 = new Ticket("xxxx");



                t1.start();

                t2.start();

                System.out.println("Hello World!");

        }

}
回复 使用道具 举报
楼上正解,哈哈
System.out.println(Thread.currentThread().getName()+"buy:"+tick);
                                                /*
                                                线程启动后,t1线程执行到这段代码后停止,而此时cpu执行权交给了t2线程也执行完以上
                                                代码,此时共享数据tick并未自减,所以会打印出两张100的票。
                                                同理,打印出两张任意大于零的同数票都有可能,由于线程的执行权是由cpu交赋的,
                                                甚至会出现一张为1,一张为0。

                                                */
回复 使用道具 举报
  1.         public synchronized void show()//建立同步函数;
  2.         {
  3.                 if (tick > 0)
  4.                 {
  5.                         System.out.println(Thread.currentThread().getName()+"---"+tick--);
  6.                 }
  7.         }
复制代码
今天早上又写了一下,建立了一个同步函数,解决了,谢谢大家。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马