黑马程序员技术交流社区

标题: 请教多线程 [打印本页]

作者: 郑飞    时间: 2014-6-25 02:43
标题: 请教多线程
本帖最后由 郑飞 于 2014-6-25 02:47 编辑

class Ticket implements Runnable
{
        private int tick = 100;
        public void run()
        {
                while(true)
                {
                                synchronized(Ticket.class)
                                {
                                        if(tick>0)
                                        {
                                                try{Thread.sleep(10);}catch(Exception e){}
                                                System.out.println(Thread.currentThread().getName()+"==maipiao----"+tick--);
                                        }
                                }                     
                 }
        }
}

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

上面代码运行后没问题

问题出在 1.不用synchronized的时候 运行4线程 打印完后 鼠标龟速 机子卡的要命 只能1-3线程运行正常
               
               2.用了synchronized后 几个线程都正常
               
               这后面的原理是什么啊 为什么这种情况 我看视频里运行4线程也没问题啊?

作者: 二月的雨    时间: 2014-11-24 00:19
关键点在于 while(true),楼主也说明了,这个卡机现象是打印完之后出现的。是因为在打印完之前Thread.sleep(10);}   CPU还有不到10ms的休息时间,等打印完成之后,tick不再>0, 因此就连几ms的休息时间也没有啦。 因为死循环的存在,4个线程一直在不停歇的耗费CPU资源,没有休息时间。因此CPU基本上会100%占用,好点的双核或者四核机器还好,差点的机器就会出现问题啦。

用了synchronized后 几个线程都正常,其实也只是一种假象,打印完之后4个线程依然存在,只是因为锁的存在而情况好一点。




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