黑马程序员技术交流社区
标题:
多线程里的卖票系统里的疑问
[打印本页]
作者:
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