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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘 佳 中级黑马   /  2012-9-27 17:14  /  1306 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘 佳 于 2012-9-27 18:12 编辑

多线程的卖票例子,老师上课讲的是用while循环,我自己用的for循环,前面都还正常,但是讲到了同步代码块这里开始出问题
我想问下如果要解决多线程的安全问题,这个小代码里面可以用for循环吗?应该怎么改呢?

可以帮我改改这个程序吗?怎么改才能正常?//是我加了同步代码块时的语句,执行完我就崩溃了。。

/*
需求:一个简单的卖票程序。
*/

class ChuangKou implements Runnable//extends Thread
{
        
        private int x=60;
        //Object obj=new Object();
        
        public void run()
        {
                //synchronized(obj)
                //{
                         for(x=60;x>0;x--)
                        {
                                try{Thread.sleep(10);}
                                catch(Exception e){}
                                System.out.println(Thread.currentThread().getName()+"卖票"+(x-1));
                        }
                                
                //}
                        
        }
}

class ThreadDemo1
{
        public static void main(String[] args)
        {
               
                ChuangKou a=new ChuangKou();
                Thread x=new Thread(a,"一窗口");
                Thread y=new Thread(a,"二窗口");
                Thread z=new Thread(a,"san窗口");
                x.start();
                y.start();
                z.start();

               

        }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
有人帮我解答一下么。。。
回复 使用道具 举报
刘 佳 发表于 2012-9-27 18:24
有人帮我解答一下么。。。

是不是 到了等待唤醒机制后才出现的问题
回复 使用道具 举报
  1. <p>/*
  2. 需求:一个简单的卖票程序。
  3. */
  4. private int x = 600;
  5. Object obj = new Object();</p><p> public void run() {</p><p>  // for(x=60;x>0;x--)//
  6.   for (;;) {
  7.    synchronized (obj) {
  8.     if (x > 0) {
  9.      try {
  10.       Thread.sleep(10);
  11.      } catch (Exception e) {
  12.      }
  13.      System.out.println(Thread.currentThread().getName() + "卖票"
  14.        + x);
  15.     }
  16.    }
  17.    x--;
  18.   }</p><p> }//<font color="red">将操作的共享数据都放到锁里!</font>
  19. </p>
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
/*
需求:一个简单的卖票程序。
*/

class ChuangKou implements Runnable// extends Thread
{

        private int x;
        Object obj = new Object();

        public void run()
        {

                for (x = 60; x > 0; x--)
                {
                        try
                        {
                                Thread.sleep(10);
                        }
                        catch (Exception e)
                        {
                        }
                        synchronized (obj) //把共享数据同步就可以了
                        {
                                if (x > 0)//加多个判断
                                        System.out.println(Thread.currentThread().getName()
                                                        + ",卖票:" + (x));
                        }
                }

        }
}

class Test1
{
        public static void main(String[] args)
        {

                ChuangKou a = new ChuangKou();
                Thread x = new Thread(a, "一窗口");
                Thread y = new Thread(a, "二窗口");
                Thread z = new Thread(a, "san窗口");
                x.start();
                y.start();
                z.start();

        }
}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

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