黑马程序员技术交流社区
标题:
线程中只有第一个线程被执行
[打印本页]
作者:
hellotaomi
时间:
2015-5-25 18:01
标题:
线程中只有第一个线程被执行
写的一个卖票线程,代码如下:
class Ticket implements Runnable
{
private int num=100;
Object obj=new Object();//obj即为同步锁
Boolean flag=true;//flag用于跳出while循环
public void run()
{
synchronized(obj)
{
while(flag)
{
if(num>0)
{
try{Thread.sleep(100);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"...sale:"+num--);
}
else
{
flag=false;
}
}
}
}
}
class Thread1
{
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();
}
}
复制代码
可是在执行时,一直都只有线程0被执行了,其他三个线程都没有被执行,即使将num设置为1000也是如此,不知道为什么,所以求各位大神帮忙解答。
作者:
ZSMAN
时间:
2015-5-25 18:26
不要讲while循环放在synchronized里面~试试将
synchronized(obj)放在while和if之间~
作者:
hellotaomi
时间:
2015-5-26 09:02
ZSMAN 发表于 2015-5-25 18:26
不要讲while循环放在synchronized里面~试试将 synchronized(obj)放在while和if之间~
嗯,经你一点拨忽然发现确实应该synchronized放在while内,不然一旦一个线程进入while,那就必须等while循环执行完才能再次释放锁,让四个线程重新抢资源,可是此时,100张票都已经买完了。而且经验证将synchronized放while里面确实就OK了。谢谢你了~
作者:
David19910809
时间:
2015-5-26 09:28
第一个线程进去 synchronized(obj)
09. {
10. while(flag)
11. {
12. if(num>0)
13. {
14. try{Thread.sleep(100);}catch(Exception e){}
15. System.out.println(Thread.currentThread().getName()+"...sale:"+num--);
16. }
17. else
18. {
19. flag=false;
20. }
21. }
22. }
被锁住出不来了 ,
作者:
途中ms前进
时间:
2015-5-26 12:54
while循环放在同步内第一个线程进去以后一直为true会一直执行完
作者:
姬光普
时间:
2015-5-26 14:21
ZSMAN 发表于 2015-5-25 18:26
不要讲while循环放在synchronized里面~试试将 synchronized(obj)放在while和if之间~
楼上正解
作者:
dailihua
时间:
2015-5-26 21:52
因为第一个线程拿到了obj这把锁,其他线程就拿不到锁只能干等着~
作者:
dailihua
时间:
2015-6-13 12:38
路过学习~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2