黑马程序员技术交流社区
标题:
多线程同时卖票有不明白的地方
[打印本页]
作者:
ぺsimon☆
时间:
2013-5-15 16:10
标题:
多线程同时卖票有不明白的地方
本帖最后由 ぺsimon☆ 于 2013-5-15 17:10 编辑
/*
有100张票,4个窗口在同时卖票,用多线程实现
*/
class Ticket implements Runnable
{
//定义100张票
private int ticket=100;
//覆盖run方法
public void run()
{
while(true)
{
if(ticket>0)
{
if(ticket==1)
try{Thread.sleep(1000);}catch(Exception e){e.toString();}
System.out.println(ticket);
ticket=ticket-1;
/*
注意问题:System.out.println(ticket);
ticket=ticket-1;
写成System.out.println(ticket--);有什么区别呢?好像写成ticket--会输出两个1,但是当分开写的时候
没有1出现了,这是为什么呢,不太明白?兄弟们帮帮忙
*/
}
else
break;
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t);
t1.start();
Thread t2=new Thread(t);
t2.start();
}
}
复制代码
作者:
胡帅冰
时间:
2013-5-15 16:37
这两个写法没任何的区别,都是打印一下ticket 然后使ticket-1。出现两个1,或者不出现1,是在多线程运行过程中出现的安全问题。你再往后看到多线程的安全就知道了。你可以再多运行几次看看,不管哪种打印方法,两个1或者不出现1的现象都是会出现的。
作者:
slatop@qq.com
时间:
2013-5-15 16:41
输出几个1和你现在的代码没关系。你没有做同步操作。所以有可能随机出来,一个1,或零个1,或是两个1.
注意问题:System.out.println(ticket);
28. ticket=ticket-1;
29.
30. 写成System.out.println(ticket--);
以上两种写法在此时是没有不同的。
所以你的问题在于线程同步问题没解决,并不在于代码有问题。线程同步的方法毕老师有讲继续向后看吧。我就不在这里说了挺长的。
不过可以告诉你ticket=ticket-1;
和ticket--的区别。ticket=ticket-1是先减一然后取值,等同于--ticket 而ticket--是先取值再减一。
作者:
ぺsimon☆
时间:
2013-5-15 17:09
哦,我明白了谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2