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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李海 中级黑马   /  2012-6-14 09:49  /  1985 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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();



        }
}


问题:看红颜色部分

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
为什么只打印4个数,一个线程的开始后,必须等另一个线程执行完,第二个线程才可以运行,除了多线程的使用。因为线程ti开始运行的时候,t1还没运行完t2就开始运行了,但是t1要等t1运行完,t2才可以运行,所以当t1遇break后停止了,这时因为ticket定义成了成员变量,在自减后的值是99,当第二个线程进去后ticket的值也是从99才是计算。t3和t4也是这样的原理
回复 使用道具 举报
按照源代码,不加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:28
按照源代码,不加break不会出错的,代码没问题,运行正常。楼主说的电脑死机有可能是硬件的问题,并不知代 ...

没加break的话的确会死机,应该不是硬件问题。。。因为我刚刚重启了电脑:L
回复 使用道具 举报
王晓新 发表于 2012-6-14 10:36
没加break的话的确会死机,应该不是硬件问题。。。因为我刚刚重启了电脑 ...

我运行了的,完全没有问题啊
回复 使用道具 举报
黄捷 发表于 2012-6-14 10:41
我运行了的,完全没有问题啊

我也运行了啊,跟楼主的情况一样
回复 使用道具 举报
为什么没加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,等的情况。

点评

感觉比较赞同你的解释,另外执行这个程序CPU确实会跑到100,但是死不死机估计和电脑硬件有关的,我的没死机~  发表于 2012-6-14 13:03

评分

参与人数 3技术分 +1 黑马币 +4 收起 理由
李海 + 2
黄奕豪 + 1 赞一个!
熊雪莲 + 2 赞一个!

查看全部评分

回复 使用道具 举报
李海 中级黑马 2012-6-14 16:09:51
8#
王晓新 发表于 2012-6-14 10:36
没加break的话的确会死机,应该不是硬件问题。。。因为我刚刚重启了电脑 ...

   是因为你的程序没有没有跳出循环   导致cpu使用率是100%  
回复 使用道具 举报
李海 发表于 2012-6-14 16:09
是因为你的程序没有没有跳出循环   导致cpu使用率是100%

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

  恩  谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马