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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张智文 中级黑马   /  2013-8-9 14:09  /  1391 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lilylikejack 于 2013-8-9 17:14 编辑
  1. class  Ticket implements Runnable
  2. {
  3.         private int tick =40;
  4.         public void run()
  5.         {
  6.                 while(true)
  7.                 {
  8.                         if(tick>0)
  9.                         {
  10.                         System.out.println(Thread.currentThread().getName()+"...sale:"+tick--);

  11.                         
  12.                         }
  13.                 }
  14.         }
  15. }

  16. class TicketDemo
  17. {


  18.         public static void main(String[] args)
  19.         {
  20.                 Ticket t = new Ticket();

  21.                 Thread t1 = new Thread(t);
  22.                 Thread t2 = new Thread(t);
  23.                 Thread t3 = new Thread(t);
  24.                 Thread t4 = new Thread(t);
  25.                 t1.start();
  26.                 t2.start();
  27.                 t3.start();
  28.                 t4.start();

  29.         }

  30. }
复制代码
听的感觉差不多,自己敲了一遍代码 我想在票卖完的时候加一句打印一句“票已售完”该加在哪里。。自己常识加了几次都失败了

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

2 个回复

正序浏览
  1. class Ticket implements Runnable
  2.    {
  3.        private int tick = 100;     //堆内存中

  4.        Object obj = new Object();
  5.        // public (synchronized) void run()(也可以把synchronized放函数上做为修饰符)
  6.        public  void run()
  7.        {
  8.                while(true)
  9.                {
  10.                        synchronized (obj)
  11.                        {
  12.                                if(tick>0)
  13.                                {
  14.                                        try{Thread.sleep(50);}catch(Exception e){}
  15.                        System.out.println(Thread.currentThread().getName()+"^^sale:"+tick--);
  16.                                }
  17.                                else
  18.                                {
  19.                                        System.out.println("票已售完");
  20.                                        Thread.currentThread().stop();
  21.                                       
  22.                                }
  23.                             }
  24.                }
  25.         }
  26.     }

  27.     class TicketDemo
  28.     {
  29.         public static void main(String[] args)
  30.        {
  31.            Ticket t = new Ticket ();
  32.            Thread t1 = new Thread(t);
  33.            Thread t2 = new Thread(t);
  34.            Thread t3 = new Thread(t);
  35.            Thread t4 = new Thread(t);
  36.            t1.start();
  37.            t2.start();
  38.            t3.start();
  39.            t4.start();
  40.         }
  41.      }
复制代码
代码如上,需要注意的是:
1、因为几个线程同时访问Ticket类对象t的一个成员变量tick,
   所以要在重写run方法的时候当访问到此变量的代码要加上同步,避免数据出错;
2、四个线程同时买票,就等于四个窗口同时卖票,当地一个线程判断卖完了会打印“票已卖完”,然后此线程死掉,第二个线程又会执行这句,
   所以就好像每个窗口都会提示票卖完了,会打印四句
希望可以帮到你

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
循环加一个结束标记,然后在主线程中等待四个线程终止,即join方法,然后打印语句。暂时只能想到这个方法了,有什么好想法通知一声啊。谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马