黑马程序员技术交流社区

标题: 多线程编程的问题 [打印本页]

作者: 李海    时间: 2012-6-14 09:49
标题: 多线程编程的问题
class Ticket implements  Runnable
{
        private  int ticket=100;
        public void run()  // 这里面是多线程要运行的程序
        {
                while(true) //写这里是为了循环  使票能够全部输出
                {
                        if(ticket>0)  
                        {System.out.println(Thread.currentThread().getName()+"  " + ticket--);}
                              break;  // 在我没加这段代码前,票数是从1到100;但是造成了电脑的死机  cpu利用率达到了100%  当我加上break后  票数为什么只能跑100 99  98 97 四个数字呢??                }

        }

}



class  XianChengDemo
{
        public static void main(String[] args)
        {
                Ticket d = new Ticket();
                Thread t1= new Thread(d );
                Thread t2= new Thread(d );
                Thread t3= new Thread(d );
                Thread t4= new Thread(d );
                t1.start();
                t2.start();
                t3.start();
                t4.start();



        }
}


问题:看红颜色部分
作者: 郑传庆    时间: 2012-6-14 10:00
为什么只打印4个数,一个线程的开始后,必须等另一个线程执行完,第二个线程才可以运行,除了多线程的使用。因为线程ti开始运行的时候,t1还没运行完t2就开始运行了,但是t1要等t1运行完,t2才可以运行,所以当t1遇break后停止了,这时因为ticket定义成了成员变量,在自减后的值是99,当第二个线程进去后ticket的值也是从99才是计算。t3和t4也是这样的原理
作者: 黄捷    时间: 2012-6-14 10:28
按照源代码,不加break不会出错的,代码没问题,运行正常。楼主说的电脑死机有可能是硬件的问题,并不知代码自身。
     如果加了break显然就只能打印4个数字。当t1进去时,执行打印语句,然后执行break语句,同样t2,t3,t4进来都会照此执行一次,这时候,主线程会以为整个线程都已结束,就会关闭,导致t1,t2,t3,t4全部退出,导致只出现4个数字,这四个数字必然会是t1,t2,t3,t4各执行一次。而这四个数字,每次你在执行打印的时候自减1动作,让他递减到97。
      如果把break换成continue是能够运行起来的,楼主不妨多试试。

作者: 王晓新    时间: 2012-6-14 10:36
黄捷 发表于 2012-6-14 10:28
按照源代码,不加break不会出错的,代码没问题,运行正常。楼主说的电脑死机有可能是硬件的问题,并不知代 ...

没加break的话的确会死机,应该不是硬件问题。。。因为我刚刚重启了电脑:L
作者: 黄捷    时间: 2012-6-14 10:41
王晓新 发表于 2012-6-14 10:36
没加break的话的确会死机,应该不是硬件问题。。。因为我刚刚重启了电脑 ...

我运行了的,完全没有问题啊
作者: 王晓新    时间: 2012-6-14 10:47
黄捷 发表于 2012-6-14 10:41
我运行了的,完全没有问题啊

我也运行了啊,跟楼主的情况一样
作者: 揭耀祖    时间: 2012-6-14 11:35
为什么没加break会使电脑的 cpu利用率达到了100%呢!看下面的:
while(true) //写这里是为了循环  使票能够全部输出
                {
                        if(ticket>0)  
                        {System.out.println(Thread.currentThread().getName()+"  " + ticket--);}
                              break;           //因为没加这句时,就算是ticket<0了,程序还是在while()里打转,并没有结束,只是这时没有执行if()后的语句罢了,因为while(true)吗!
             }
while()一直为真,不管ticket值是多少,循环都不会结束。而加了break后,读到这句时就跳出了循环。
至于你说的为什么加了break后会出现你说的情况那是因为,当代码执行到这句后,就会跳出循环,跳出循环后这个线程就结束了,而每天个线程只打印过一次,所以就会出现只输出100,99,98,97,等的情况。

作者: 李海    时间: 2012-6-14 16:09
王晓新 发表于 2012-6-14 10:36
没加break的话的确会死机,应该不是硬件问题。。。因为我刚刚重启了电脑 ...

   是因为你的程序没有没有跳出循环   导致cpu使用率是100%  
作者: 王晓新    时间: 2012-6-14 16:14
李海 发表于 2012-6-14 16:09
是因为你的程序没有没有跳出循环   导致cpu使用率是100%

嗯,看到了jxj4227982333这位的解释,明白了!
作者: 李海    时间: 2012-6-14 16:16
jxj4227982333 发表于 2012-6-14 11:35
为什么没加break会使电脑的 cpu利用率达到了100%呢!看下面的:
while(true) //写这里是为了循环  使票能够 ...

  恩  谢谢





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