黑马程序员技术交流社区

标题: 线程问题--怎么看不到其他线程 [打印本页]

作者: 胥文    时间: 2013-2-21 17:09
标题: 线程问题--怎么看不到其他线程
public class ThreadTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                WindowTicket wt = new WindowTicket();
                Thread t1 = new Thread(wt);
                Thread t2 = new Thread(wt);
                Thread t3 = new Thread(wt);
                t1.start();
                t2.start();
                t3.start();
        }

}

class WindowTicket implements Runnable
{
         int ticket = 1000;
        Object obj = new Object();
        public  void run()
        {
                        synchronized(obj)
                        {
                               
                                while(ticket>0)
                                {
                                        //Thread.sleep(10);
                                        System.out.println(Thread.currentThread().getName()+"---"+ticket--);
                                }
                        }
               
        }
}
怎么运行就一个线程,我开了多个线程为什么看不到其他线程的执行情况;
打印结果:由于字数限制我删掉了前面的打印结果,为什么都是0线程
Thread-0---38
Thread-0---37
Thread-0---36
Thread-0---35
Thread-0---34
Thread-0---33
Thread-0---32
Thread-0---31
Thread-0---30
Thread-0---29
Thread-0---28
Thread-0---27
Thread-0---26
Thread-0---25
Thread-0---24
Thread-0---23
Thread-0---22
Thread-0---21
Thread-0---20
Thread-0---19
Thread-0---18
Thread-0---17
Thread-0---16
Thread-0---15
Thread-0---14
Thread-0---13
Thread-0---12
Thread-0---11
Thread-0---10
Thread-0---9
Thread-0---8
Thread-0---7
Thread-0---6
Thread-0---5
Thread-0---4
Thread-0---3
Thread-0---2
Thread-0---1

作者: 罗海云    时间: 2013-2-21 17:14
public class ThreadTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                WindowTicket wt = new WindowTicket();
                Thread t1 = new Thread(wt);
                Thread t2 = new Thread(wt);
                Thread t3 = new Thread(wt);
                t1.start();
                t2.start();
                t3.start();
        }

}

class WindowTicket implements Runnable
{
         int ticket = 1000;
        Object obj = new Object();
        public  void run()
        {
                        synchronized(obj)
                        {
                                
                                while(ticket>0)//因为你这儿有个while判断,.只要ticket>0就一直循环里面的内容, 上面又加了锁,所以一个线程进来之后
                                                                    //其他线程都进不来就执行完了
                                {
                                        //Thread.sleep(10);
                                        System.out.println(Thread.currentThread().getName()+"---"+ticket--);
                                }
                        }
               
        }
}

作者: 王钊    时间: 2013-2-21 17:29
本帖最后由 王钊 于 2013-2-21 17:36 编辑

不管哪个线程进入了synchronized(obj)其他线程就没有机会进入了,
你重点是错在一个线程进去就要开始while循环,等到Ticket减到0,这个synchronized方法才结束,等到别的线程有机会进来了,一看while循环条件不成立,没机会执行打印了。
帮你修改了一下代码:
注意synchronized中的这个if条件非常关键,就在于执行到ticket减到1的时候,这时候如果同时两个线程再进来(while循环大于1都成立),一个线程
执行完thick--,释放锁后,如果没有if判断,第二个线程会继续ticke--,ticke会变成0,而如果三个线程都进来,后果更可怕,ticket会减到-1,if判断必须加!

  1. public void run()
  2.         {
  3.                         while (ticket > 0)
  4.                         {
  5.                                 // Thread.sleep(10);
  6.                                 synchronized (obj)
  7.                                 {
  8.                                         if (ticket>0)
  9.                                         {
  10.                                                 System.out.println(Thread.currentThread().getName() + "---"
  11.                                                                 + ticket--);
  12.                                         }
  13.                                 }
  14.                                 
  15.                         }
  16.                

  17.         }
复制代码





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