黑马程序员技术交流社区

标题: 多线程里的卖票系统里的疑问 [打印本页]

作者: tiny    时间: 2015-6-13 09:37
标题: 多线程里的卖票系统里的疑问
关于try和catch。学习视频的原话:出现线程挂在if判断以后。还有出现卖0,-1,-2票现象。怎么解决呢。让它停一下。冻结状态。休眠sleep。小弟认为让线程睡和线程自然而然挂掉并没有什么区别。没加锁情况下并不能解决负票问题。用了同步锁之后。try catch注释掉了也没有什么影响啊。是不是说明了try catch可以去掉呢?

class Ticket implements Runnable               
{
        private int tick = 100;
        Object obj = new Object();
        public void run()
        {
                while(true)
                {
                        synchronized(obj)
                        {
                                if(tick>0)
                                {
                                        //try{Thread.sleep(10);}catch(Exception e){}
                                        System.out.println(Thread.currentThread().getName()+"sale :"+tick--);
                                }
                        }
                }
        }
}


class TicketDemo
{
        public static void main(String[] args)
        {
                Ticket t =new Ticket();

                Thread t1 = new Thread(t);//创建了一个线程
                Thread t2 = new Thread(t);//创建了一个线程
                Thread t3 = new Thread(t);//创建了一个线程
                Thread t4 = new Thread(t);//创建了一个线程
                t1.start();
                t2.start();
                t3.start();
                t4.start();
作者: limingdada    时间: 2015-6-13 09:39
去掉的话无法通过编译。
作者: tiny    时间: 2015-6-13 09:42
通过了的才问的。
作者: limingdada    时间: 2015-6-13 09:46
本帖最后由 limingdada 于 2015-6-13 09:49 编辑

仔细看了下你的问题,不是try ctach可以去掉
因为你把sleep都注释掉了,自然不用抛出异常了
加锁之后,sleep的作用是让当前线程休眠一下/
没加锁之前。加sleep的原因是更容易出现错票的状态
因为没锁的情况下,一个线程休眠,没锁的话,其他线程都会进来/这样全部线程都可能通过了if语句的判断,在线程苏醒之后,会打印tick并自减,自然就出现-1 -2这种结果。

作者: mishisanyi    时间: 2015-6-13 09:47
wait()方法需要抛出异常啊,如果不适用wait的话,可以不适用try啊
作者: tiny    时间: 2015-6-13 09:54
那么现在的情况是有锁的,假如线程1拿锁之后进来,是不是睡不睡都没关系了(可以注释掉sleep)。因为其他线程在线程1出来之前都进不来,出现不了同票状态。
作者: limingdada    时间: 2015-6-13 09:59
是的,你加锁之后,sleep也不会释放锁。
你用wait方法的话会释放锁,

作者: 大西洋    时间: 2015-6-13 11:04
本帖最后由 大西洋 于 2015-6-13 18:44 编辑

sleep都被你注释掉了。。。当然就没任何异常了。。。
你把Thread.sleep(10);暴露出来试试。:lol异常可以防止程序崩溃。

作者: 天涯111    时间: 2015-6-13 11:20
大神们讨论的好详细,进来学习一下,这一点刚好没学过!!!:D
作者: 志行    时间: 2015-6-13 12:41
两个判断句+一个锁  你别用while(ture)  试试 while(ticket>0)  synchorized   if(ticket>0)




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