黑马程序员技术交流社区

标题: 求教:多线程练习 [打印本页]

作者: Gump    时间: 2013-11-1 13:37
标题: 求教:多线程练习
/*
需求:简单的卖票程序
多个窗口卖票。
想在最后实现 打印ticket over ,有什么好的方法么?越多越好!!
*/

class Ticket extends Thread
{
        private static int tick = 88;
        Ticket(String name)
        {
                super(name);
        }
        public void run()
        {
                while (true)
                {
                        if(tick>0)
                        {
                                System.out.println(Thread.currentThread().getName()+"sale:"+tick--);
                        }
                }
        }
}

class TicketDemo
{
        public static void main(String[] args)
        {
                Ticket t1 = new Ticket("oneWindow");
                Ticket t2 = new Ticket("twoWindow");
                Ticket t4 = new Ticket("threeWindow");
                Ticket t3 = new Ticket("fourWindow");
                Ticket t5 = new Ticket("fiveWindow");
                t1.start();
                t2.start();
                t4.start();
                t5.start();
                t3.start();
               
                System.out.println("ticket over");//想在语句最后实现这句话,该怎么做啊?
        }
}

作者: 王松松    时间: 2013-11-1 14:42
在run方法中试试看。
if(tick==0)
{
      System.out.println("ticket over");
}
作者: 杨增坤    时间: 2013-11-1 14:54
更改run()方法
  1. public void run()
  2.         {
  3.                 while (tick>0)
  4.                 {  
  5.                          System.out.println(Thread.currentThread().getName()+"sale:"+tick--);
  6.                 }
  7.                 if(tick==0){
  8.                         System.out.println("ticket over");
  9.                 }
  10.         
  11.         
  12.         }
复制代码
希望对你有帮助!

作者: kellyzyb    时间: 2013-11-1 15:01
首先你的程序有个问题,是否要考虑安全问题?5个线程操作共享数据时会产生安全问题。而且要打印出"ticket over"表示票已售光的话。要正确显示的话必须是要加同步的。
下面是在你的原程序上改的,当然最方便的还是实现Runnable接口,不用在创建这么多子类对象。


  1. /*
  2. 需求:简单的卖票程序
  3. 多个窗口卖票。
  4. 想在最后实现 打印ticket over ,有什么好的方法么?越多越好!!
  5. */

  6. class Ticket extends Thread
  7. {
  8.         private static int tick = 880;
  9.         Ticket(String name)
  10.         {
  11.                 super(name);
  12.         }
  13.         public void run()
  14.         {
  15.                 while (true)
  16.                 {
  17.                         synchronized("A")
  18.                         {
  19.                                  if(tick>0)
  20.                                          System.out.println(Thread.currentThread().getName()+"sale:"+tick--);
  21.                                  else
  22.                                  {
  23.                                          System.out.println("ticket over");
  24.                                          break;
  25.                                  }
  26.                                          
  27.                         }
  28.                        
  29.                 }
  30.         }
  31. }

  32. class TicketDemo
  33. {
  34.         public static void main(String[] args)
  35.         {
  36.                 Ticket t1 = new Ticket("oneWindow");
  37.                 Ticket t2 = new Ticket("twoWindow");
  38.                 Ticket t4 = new Ticket("threeWindow");
  39.                 Ticket t3 = new Ticket("fourWindow");
  40.                 Ticket t5 = new Ticket("fiveWindow");
  41.                 t1.start();
  42.                 t2.start();
  43.                 t4.start();
  44.                 t5.start();
  45.                 t3.start();

  46.         }
  47. }
复制代码

作者: Gump    时间: 2013-11-1 15:37
王松松 发表于 2013-11-1 14:42
在run方法中试试看。
if(tick==0)
{

谢谢,这是一个方法
作者: Gump    时间: 2013-11-1 15:38
杨增坤 发表于 2013-11-1 14:54
更改run()方法希望对你有帮助!

谢谢,方法不错!
作者: Gump    时间: 2013-11-1 15:39
kellyzyb 发表于 2013-11-1 15:01
首先你的程序有个问题,是否要考虑安全问题?5个线程操作共享数据时会产生安全问题。而且要打印出"ticket o ...

谢谢,还没有学到同步,不多,你的break;提醒了我




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