synchronized 同步嘛
一次只有一个 你自己也写了 
前边的不睡 后边怎么进去啊

解决方案 »

  1.   

    线程需要时间切换
    如果一直占着CPU
    另外一根线程就无法的到CPU时间来运行
      

  2.   

    才10张票一下子就完了,不用sleep哪来线程转换
      

  3.   

    不是这样的。
    即使在main线程里不调sleep,线程调度仍然会发生的。楼主说的结果不正确是什么意思?
      

  4.   

    你的程序本身有严重问题, 另外不能靠延时来调度线程,特别是1ms
    不通机器上或允许多次可能有不通结果错误在这里
        m.booking(2); // 执行后线程没启出来,假设叫Th1
        m.booking(2); // 执行后线程没启出来,叫Th2
        m.booking(4); // 执行后线程没启出来,叫Th3
                      // 此时ThreadBook的num为4!!!   Th1启动了,订票4张: 还剩下6 张
       Th2启动了,订票4张: 还剩下2 张 
       Th3启动了,订票4张: 无法预定所需票数
      

  5.   

    在任何时间点上
    占用cpu的线程是唯一的
    也是不确定的
      

  6.   

    milkslzz(网络小毛虫)  正解
     m.booking(2); //这时,m.num为2,但th1.run()很可能还没有运行。如果主线程sleep,
                   //那th1.run就运行并调用了b.booking(2);
     m.booking(2); //这时,m.num为2,但th2.run()很可能还没有运行。如果主线程sleep,
                   //那th2.run就运行并调用了b.booking(2);
     m.booking(4); //这时,m.num为4,但th3.run()很可能还没有运行。如果主线程sleep,
                   //那th3.run就运行并调用了b.booking(4); 如果这时,th1,th2,th3才得到调度,那么它们的run方法里面调用b.booking(num)时,num都是4;
     一个解决办法:
    改一下构造函数和booking方法。Threadbook(BookingTicket b,int num)   
    {
    this.b=b;
    this.num = num;
    }
    public void static booking(BookingTicket b,int num)   
    {
       new Threadbook(b,num).start(); 
    }main()里面这样调:
    BookingTicket b=new BookingTicket();
    Threadbook.booking(b,2);
    Threadbook.booking(b,2);
    Threadbook.booking(b,4);就ok了
    关键在于你的代码里三个线程共用一个Threadbook对象,从而共用了同一个num。产生了执行结果依赖于线程调度过程的错误结果。