黑马程序员技术交流社区

标题: 毕向东视频中,同步while(true)问题 [打印本页]

作者: 张伟强    时间: 2012-8-3 18:28
标题: 毕向东视频中,同步while(true)问题
本帖最后由 张伟强 于 2012-8-3 20:11 编辑
  1. package good.study;

  2. class TicketTest implements Runnable
  3. {
  4.         private  int tick = 100;
  5.         Object obj = new Object();
  6.         boolean flag = true;
  7.         public  void run()
  8.         {
  9.                 if(flag)
  10.                 {
  11.                         while(true) //谁能解释一下此处的while(true)是什么意思?有什么作用?
  12.                         {
  13.                                 synchronized(this)
  14.                                 {
  15.                                         if(tick>0)
  16.                                         {
  17.                                                 try{Thread.sleep(10);}catch(Exception e){}
  18.                                                 System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
  19.                                         }
  20.                                 }
  21.                         }
  22.                 }
  23.                 else
  24.                         while(true)
  25.                                 show();
  26.         }
  27.         public synchronized void show()
  28.         {
  29.                 if(tick>0)
  30.                 {
  31.                         try{Thread.sleep(10);}catch(Exception e){}
  32.                         System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
  33.                 }
  34.         }
  35. }


  36. class  Ticket
  37. {
  38.         public static void main(String[] args)
  39.         {

  40.                 TicketTest t = new TicketTest();

  41.                 Thread t1 = new Thread(t);
  42.                 Thread t2 = new Thread(t);
  43.                 t1.start();
  44.                 try{Thread.sleep(10);}catch(Exception e){}
  45.                 t.flag = false;
  46.                 t2.start();
  47.         }
  48. }
复制代码
请看上面代码注释部分,本程序处理两个线程同时买票问题。毕老师在讲同步的时候代码中多次出现while(true),只听到他说这样写输出的内容会增多,但是没明白这个while(true)究竟是干什么用的,具体是什么意思?这个true究竟又是值得什么?
作者: 郑枫    时间: 2012-8-3 18:45
while(true)
{
无限循环的部分
}

作者: 王渠    时间: 2012-8-3 19:00
本帖最后由 王渠 于 2012-8-3 19:26 编辑

package good.study;

class TicketTest implements Runnable
{
        private  int tick = 100;
        Object obj = new Object();
        boolean flag = true;
        public  void run()
        {
                if(flag) //这个地方有一个标识
                {
                        while(true)
                        {
                                synchronized(this)
                                {
                                              if(tick>0)//进入循环后,还是会不断的判断票的数量
                                             {
                                                         try{Thread.sleep(10);}catch(Exception e){}
                                                         System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
                                             }
                                }
                        }
                }
                else
                        while(true)
                                show();//show方法就用show方法中的if(tick>0)来判断票的数量
        }
        public synchronized void show()
        {
                if(tick>0)
                {
                        try{Thread.sleep(10);}catch(Exception e){}
                        System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
                }
        }
}


class  Ticket
{
        public static void main(String[] args)
        {

                TicketTest t = new TicketTest();

                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
                t1.start();
                try{Thread.sleep(10);}catch(Exception e){}//这个地方让主线程睡了10毫秒。
                t.flag = false;//这里改变了标识。
                t2.start();
        }
}


这段代码是用来演示,同一把锁的时候,不会出现安全问题的。开始我理解错误成了还以为是演示死锁的呢...
show()方法,有show方法的锁。同步代码块,有同步代码块的锁。其实两者用的是同一把锁,this对象。
while(true)是为了让程序循环执行,在此处的目的就是持续的卖票。
当卖到最后一张票的时候,无论是线程t1还是线程t2拿到了锁,另外一个线程都无法再进入同步区域。直到释放锁。获取到执行权的线程再继续去执行时会判断if(tick>0)是false,也就不再买票了,从而确保了程序的安全性







作者: 官文昌    时间: 2012-8-3 19:09
while(表达式){执行语句}语句中,当表达式为真时,它就运行执行语句,毕老师把表达式==true,意思就是无限运行执行语句,他的本意是为了学生更好的观察代码运行的结果,因为线程问题 当你运行次数少了,不容易观察出结果,其实他本身表达式因该是写票的数量的~~~
作者: 赵俊杰    时间: 2012-8-3 19:12
建议温习一下毕老师JAVA基础第三天的教程--while的用法。
作者: 张伟强    时间: 2012-8-3 19:18
王渠 发表于 2012-8-3 19:00
package good.study;

class TicketTest implements Runnable

谢谢你,不过这段代码确实不是演示死锁的,同步代码块和同步函数都是用的this锁,所以没有卖0号票。
作者: 王渠    时间: 2012-8-3 19:22
张伟强 发表于 2012-8-3 19:18
谢谢你,不过这段代码确实不是演示死锁的,同步代码块和同步函数都是用的this锁,所以没有卖0号票。 ...

{:3_66:}对啊,理解错误了,静态函数才是用的字节码文件呢....
我以为后面方法是用的字节码文件做的处理,所以以为是非同一把锁。

我去把他改了吧...
作者: 尤洋    时间: 2012-8-3 19:57
最简单的无限循环 while(ture){}    和  for (;;){}


                                                         
作者: 张伟强    时间: 2012-8-3 20:13
问题已解决。最初理解错误了,谢谢大家。




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