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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 宋枢浩 于 2012-2-14 17:14 编辑
  1. class Ticket implements Runnable
  2. {
  3.         private int ticket = 100;
  4.                 public void run()
  5.         {
  6.                
  7.                 while (true)
  8.                 {
  9.                                                                                
  10.                         if(ticket>0)
  11.                         {
  12.                                
  13.                                   System.out.println(Thread.currentThread().getName()+"sale: "+ticket--);
  14.                         }
  15.                                                
  16.                 }
  17.         }
  18. }
  19. class  TicketDemo
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 Ticket t = new Ticket();  
  24.                 Thread t1 = new Thread(t);
  25.                 Thread t2 = new Thread(t);
  26.                 Thread t3 = new Thread(t);
  27.                 Thread t4 = new Thread(t);
  28.                
  29.                 t1.start();
  30.                 t2.start();
  31.                 t3.start();
  32.                 t4.start();
  33.                 }
  34. }
复制代码
·······················································································
whille里面直接改成下面也可以运行。

while (ticket>0)
        System.out.println(Thread.currentThread().getName()+"sale: "+ticket--);
······················
1,这个ture和ticket>0应该是等价的吧?




评分

参与人数 1技术分 +1 收起 理由
技术测试刘老师 + 1 问的不错~

查看全部评分

7 个回复

倒序浏览
不等价。 对于该程序而言,
使用while (true) 当票卖完了线程依然没有终止,处于无限循环状态。
使用你的while (ticket>0),当票卖完了while循环结束,也就是run方法结束,从而线程终止了,程序停止。

评分

参与人数 1技术分 +1 收起 理由
技术测试刘老师 + 1 不错啊! 不要只回答啊自己也可以抛一些不会.

查看全部评分

回复 使用道具 举报
while(true)是始终执行循环啊。if(ticket>0)是循环里面的判断啊。他的这个100张票有可能是卖完到99张。一个A线程停了(线程赌塞),另一个线程B还在卖。B线程卖了之后还有0张。此时若再恢复了A线程好了ticket此时为0还没更新。没票了当然不能再卖了。所以加了一个if(ticket>0)

评分

参与人数 1技术分 +1 收起 理由
技术测试刘老师 + 1 这个问题好像大家都会啊

查看全部评分

回复 使用道具 举报
ture和ticket>0你说的这个等价问题,

while(true)和while(ticket > 0) 你应该好好分析分析,while(true)是永远成立永远循环下去,说白了就是死循环。而while(ticket > 0) 你里面是个条件表达式,用条件进行判断,判断就应该有两种情况一种是true另一个是false.

你仔细分析分析你的程序吧..不要慌,冷静的思考.

评分

参与人数 1技术分 +1 收起 理由
技术测试刘老师 + 1 以后争取沙发哦..

查看全部评分

回复 使用道具 举报
while(true)和while(ticket > 0)不等价。
while(true)的意思是:这个程序块会一直运行,除非在命令行使用ctrl+c强制中断执行,否则它会一直运行下去的,也即它是无限循环。
而while(ticket > 0),意思是程序块满足ticket > 0才执行,否则不执行,程序继续执行while后面的语句,也即它是有限循环。
回复 使用道具 举报
while(true)和while(ticket > 0)这两条语句有本质不同,虽然后者看起来十分有用,如果这样的话就不用产生任意的循环。在非同步的情况下,可能会出现的错误就很少。如果使用同步函数+while(ticket > 0)实际执行就一条语句,而使用了while(true)后,后面出现多条语句,在不同步的时候出现安全问题很正常更容易验证。
回复 使用道具 举报
宋枢浩 黑马帝 2012-2-14 17:14:16
7#
我也是想着true会一直执行。
那干嘛不直接写ticket<0。这样能自动结束。还能节省系统资源?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
钟保罗 黑马帝 2012-2-14 21:17:28
8#
不一样的,whille(ture)是这个循环一直的循环下去,只有在循环中有停止循环的语言才能停止,而while(ticket>0)是这个循环ticket>0这个条件满足的时候才会循环,一旦ticket>0这个条件不满足了,循环将会停止。你这里while (ticket>0)
        System.out.println(Thread.currentThread().getName()+"sale: "+ticket--);也会运行是因为ticket等于100,大于0满足循环条件,所以就运行了。。。。。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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