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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tiny 中级黑马   /  2015-6-13 09:37  /  927 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

9 个回复

正序浏览
志行 中级黑马 2015-6-13 12:41:40
9#
两个判断句+一个锁  你别用while(ture)  试试 while(ticket>0)  synchorized   if(ticket>0)
回复 使用道具 举报
大神们讨论的好详细,进来学习一下,这一点刚好没学过!!!:D
回复 使用道具 举报
本帖最后由 大西洋 于 2015-6-13 18:44 编辑

sleep都被你注释掉了。。。当然就没任何异常了。。。
你把Thread.sleep(10);暴露出来试试。:lol异常可以防止程序崩溃。
回复 使用道具 举报
是的,你加锁之后,sleep也不会释放锁。
你用wait方法的话会释放锁,
回复 使用道具 举报
那么现在的情况是有锁的,假如线程1拿锁之后进来,是不是睡不睡都没关系了(可以注释掉sleep)。因为其他线程在线程1出来之前都进不来,出现不了同票状态。
回复 使用道具 举报
wait()方法需要抛出异常啊,如果不适用wait的话,可以不适用try啊
回复 使用道具 举报
本帖最后由 limingdada 于 2015-6-13 09:49 编辑

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