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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yinbolove576 中级黑马   /  2013-4-22 09:19  /  1488 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yinbolove576 于 2013-4-22 12:47 编辑

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  TicketDemo2
{
        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();
        }
}




求大神解释下,为何小弟在添加了同步代码块synchronized 后,运行的结果都是Thread-0的线程而没有出现其余线程,运行多次都是这个结果,跪求原因,谢谢!



1.jpg (21.6 KB, 下载次数: 23)

1.jpg

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

4 个回复

倒序浏览
你循环次数太少了,这个程序绝对是多线程的没有任何问题,你把循环弄成1000次试几次。肯定可以的,我都帮你验证过了,线程0、1、2、3 都有执行。
回复 使用道具 举报
代码没有问题,只是CPU的执行权被线程0自己给抢走了,其他线程还没等执行,线程0已经自己执行完了!
回复 使用道具 举报
对于main()方法;它本身就是一个主线程;在主线程没有调用  t1.start()之后就会产生一个副线程;然后副线程t1和主线程争抢资源;如果主线程继续运行;调用了t2.start()之后;又会产生一个副线程t2;然后就是有3个线程抢资源;主线程、副线程t1、副线程t2;没有出现其他线程的原因;估计是主线程还没有执行到t2.start();t1线程早就把那方法执行很多次了。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
嗯,楼上说的都有道理,首先我程序的循环次数少了是很难看得出来,其次就是线程的执行权了,哟西,感谢各位的解答哈!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马