java多线程小问题

lilyly 2012-11-29 08:40:30
各位大大,以下这段程序,在if语句中,“让线程先打印再sleep”和“让线程先sleep再打印”,结果为什么会不同?如果先sleep的话,只有一个线程在跑,why why why。。。急问

class Sell implements Runnable {
int ticket = 50;
String str = "";
public void run() {
while(true) {
synchronized(str) {
if(ticket > 0) {
try {Thread.sleep(100);} catch(Exception e) {}
System.out.println(Thread.currentThread().getName() + " is selling ticket " + ticket--);
//try {Thread.sleep(100);} catch(Exception e) {}
}
}
}
}
}
class TestSell {
public static void main(String args[]) {
Sell s1 = new Sell();
new Thread(s1).start();
new Thread(s1).start();
new Thread(s1).start();
new Thread(s1).start();
}
}
...全文
271 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky254541843 2012-12-18
  • 打赏
  • 举报
回复
在我机子上运行的效果都一样 四核的机子
lilyly 2012-11-30
  • 打赏
  • 举报
回复
引用 11 楼 dr8737010 的回复:
引用 8 楼 nmyangym 的回复:我加大到500时,先休眠的方式也会几个线程都能卖票,但某个线程一旦获得机会,就会很长时间获得运行机会。而后休眠的方法,几个线程获得机会更均匀,每个线程都卖不了10张,其他线程就会得到机会。可能和机器有关系。 sleep方法不会释放获得的锁,应该是某个线程拿到锁在死循环中一直持有它,释放锁让其他线程执行难道是操作系统的调度策略? ……
对,感觉在线程释放了锁之后,马上又抢占了CPU,不让给其他线程,不知道是不是这个原理。但是还是说不通
BadPattern 2012-11-29
  • 打赏
  • 举报
回复
引用 8 楼 nmyangym 的回复:
我加大到500时,先休眠的方式也会几个线程都能卖票,但某个线程一旦获得机会,就会很长时间获得运行机会。而后休眠的方法,几个线程获得机会更均匀,每个线程都卖不了10张,其他线程就会得到机会。可能和机器有关系。
sleep方法不会释放获得的锁,应该是某个线程拿到锁在死循环中一直持有它,释放锁让其他线程执行难道是操作系统的调度策略?
brightyq 2012-11-29
  • 打赏
  • 举报
回复
同学,看下你用了 synchronized 把它去掉,你再试试什么情况了.
lixiaomeng627 2012-11-29
  • 打赏
  • 举报
回复
引用 7 楼 lilyly 的回复:
结果是一样的?????怎么我的机器就是我上面所说的情况!!疯了,难道跟双核有关系?不应该呀。ticket变量的值设到1000,效果也是一样
当然有关系。
nmyangym 2012-11-29
  • 打赏
  • 举报
回复
我加大到500时,先休眠的方式也会几个线程都能卖票,但某个线程一旦获得机会,就会很长时间获得运行机会。而后休眠的方法,几个线程获得机会更均匀,每个线程都卖不了10张,其他线程就会得到机会。可能和机器有关系。
lilyly 2012-11-29
  • 打赏
  • 举报
回复
结果是一样的?????怎么我的机器就是我上面所说的情况!!疯了,难道跟双核有关系?不应该呀。ticket变量的值设到1000,效果也是一样
wujin198911111317 2012-11-29
  • 打赏
  • 举报
回复
经过测试,结果都是一样的啊...
luckyc2008 2012-11-29
  • 打赏
  • 举报
回复
我在自己机器上跑这段代码,都是多个线程啊,你ticket设大一点,跑跑呢,线程的运行和java虚拟机也有关系吧
lilyly 2012-11-29
  • 打赏
  • 举报
回复
是呀,我知道是加了锁,但是为什么在同步块内,把sleep加在不同的地方会结果不一样呢,如果先打印再sleep,就是多个线程同时在跑。如果先sleep,就只有一个线程在跑!
BadPattern 2012-11-29
  • 打赏
  • 举报
回复
你这程序始终都会只有一个线程在跑好不,又是死循环的跑,又是加了锁的,同一时间只有一个线程执行
lilyly 2012-11-29
  • 打赏
  • 举报
回复
自己顶顶。。555
sffx123 2012-11-29
  • 打赏
  • 举报
回复
两种都是多个线程轮着执行,但是一次只有一个线程执行。
zlllyk110 2012-11-29
  • 打赏
  • 举报
回复
你可以用wait方法试试

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧