黑马程序员技术交流社区

标题: while(true)和while(ticket>0)的区别,毕老师视频里的疑问。 [打印本页]

作者: 宋枢浩    时间: 2012-2-13 23:33
标题: while(true)和while(ticket>0)的区别,毕老师视频里的疑问。
本帖最后由 宋枢浩 于 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应该是等价的吧?





作者: 陈丹阳    时间: 2012-2-13 23:52
不等价。 对于该程序而言,
使用while (true) 当票卖完了线程依然没有终止,处于无限循环状态。
使用你的while (ticket>0),当票卖完了while循环结束,也就是run方法结束,从而线程终止了,程序停止。

作者: 成果    时间: 2012-2-13 23:53
while(true)是始终执行循环啊。if(ticket>0)是循环里面的判断啊。他的这个100张票有可能是卖完到99张。一个A线程停了(线程赌塞),另一个线程B还在卖。B线程卖了之后还有0张。此时若再恢复了A线程好了ticket此时为0还没更新。没票了当然不能再卖了。所以加了一个if(ticket>0)
作者: 李杨    时间: 2012-2-14 00:14
ture和ticket>0你说的这个等价问题,

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

你仔细分析分析你的程序吧..不要慌,冷静的思考.
作者: 侯丽星    时间: 2012-2-14 08:26
while(true)和while(ticket > 0)不等价。
while(true)的意思是:这个程序块会一直运行,除非在命令行使用ctrl+c强制中断执行,否则它会一直运行下去的,也即它是无限循环。
而while(ticket > 0),意思是程序块满足ticket > 0才执行,否则不执行,程序继续执行while后面的语句,也即它是有限循环。
作者: 魏腾飞    时间: 2012-2-14 08:56
while(true)和while(ticket > 0)这两条语句有本质不同,虽然后者看起来十分有用,如果这样的话就不用产生任意的循环。在非同步的情况下,可能会出现的错误就很少。如果使用同步函数+while(ticket > 0)实际执行就一条语句,而使用了while(true)后,后面出现多条语句,在不同步的时候出现安全问题很正常更容易验证。
作者: 宋枢浩    时间: 2012-2-14 17:14
我也是想着true会一直执行。
那干嘛不直接写ticket<0。这样能自动结束。还能节省系统资源?
作者: 钟保罗    时间: 2012-2-14 21:17
不一样的,whille(ture)是这个循环一直的循环下去,只有在循环中有停止循环的语言才能停止,而while(ticket>0)是这个循环ticket>0这个条件满足的时候才会循环,一旦ticket>0这个条件不满足了,循环将会停止。你这里while (ticket>0)
        System.out.println(Thread.currentThread().getName()+"sale: "+ticket--);也会运行是因为ticket等于100,大于0满足循环条件,所以就运行了。。。。。




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