黑马程序员技术交流社区

标题: 多线程同步代码块,卖票例子求改代码 [打印本页]

作者: 刘 佳    时间: 2012-9-27 17:14
标题: 多线程同步代码块,卖票例子求改代码
本帖最后由 刘 佳 于 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();

               

        }
}


作者: 刘 佳    时间: 2012-9-27 18:24
有人帮我解答一下么。。。
作者: 戎石锁    时间: 2012-9-27 19:58
刘 佳 发表于 2012-9-27 18:24
有人帮我解答一下么。。。

是不是 到了等待唤醒机制后才出现的问题
作者: 罗磊    时间: 2012-9-27 20:15
  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>
复制代码

作者: 李润根    时间: 2012-9-27 21:58
/*
需求:一个简单的卖票程序。
*/

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();

        }
}






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