黑马程序员技术交流社区

标题: 多线程中同步代码块的问题,求解 [打印本页]

作者: yinbolove576    时间: 2013-4-22 09:19
标题: 多线程中同步代码块的问题,求解
本帖最后由 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, 下载次数: 20)

1.jpg

作者: 聖手`书生    时间: 2013-4-22 09:35
你循环次数太少了,这个程序绝对是多线程的没有任何问题,你把循环弄成1000次试几次。肯定可以的,我都帮你验证过了,线程0、1、2、3 都有执行。
作者: 袁梦希    时间: 2013-4-22 09:49
代码没有问题,只是CPU的执行权被线程0自己给抢走了,其他线程还没等执行,线程0已经自己执行完了!
作者: 沉淀着的你    时间: 2013-4-22 10:33
对于main()方法;它本身就是一个主线程;在主线程没有调用  t1.start()之后就会产生一个副线程;然后副线程t1和主线程争抢资源;如果主线程继续运行;调用了t2.start()之后;又会产生一个副线程t2;然后就是有3个线程抢资源;主线程、副线程t1、副线程t2;没有出现其他线程的原因;估计是主线程还没有执行到t2.start();t1线程早就把那方法执行很多次了。
作者: yinbolove576    时间: 2013-4-22 12:46
嗯,楼上说的都有道理,首先我程序的循环次数少了是很难看得出来,其次就是线程的执行权了,哟西,感谢各位的解答哈!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2