你的两个线程 A B
synchronized(obj) 的 obj是同一个监视器对象嘛?

解决方案 »

  1.   

    synchronized(obj){
          while(true) {
              System.out.println("Got it");
              methodA();
              Thread.sleep(2000);
              methodB();
              obj.notifyAll();
          }
        } 这样分析一下。obj 同一时刻只能有一个方法操作它。
    obj.notifyAll(); 唤起了上面那个线程。
    但是obj这个对象还在这个方法里。所以不会执行上面的操作。
    而接着循环。
    两个问题?
    1.
      下面的没有加锁,何以notifyAll
    2.
      即然 是synchronized(obj)
      那应该在下面的操作中加入wait并唤起上面的操作。
      

  2.   

    下面的加锁了呀...不wait也可以唤醒A,然后B sleep(1000),从而让A得到锁,B线程代码改成如下:

      while(true) {
        Thread.sleep(1000); 
           synchronized(obj){  
              System.out.println("Got it"); 
              methodA(); 
              Thread.sleep(2000); 
              methodB(); 
              obj.notifyAll(); 
          } 
        }   

    同样会遇到所说的问题。
      

  3.   

    B的run()先运行了,就会阻塞A的run(),那样即便是“打印出Got it”,但由于A线程没运行,methodB()也不会有结果。
    当然这是猜测,如果要让别人真正分析你的代码,起码把“doSomething();” 、“methodA(); ”及“methodB(); ”贴出来,否则两个线程的协作关系都不知道。
      

  4.   

    进来学习一下,最近想开始学习Java
      

  5.   

    LZ,把代码都贴出来吧,否则看不出问题。就目前的代码而言,  不管A,B谁先运行,methodB()应该是会运行的。LZ检查一下自己的methodB()方法本身是不是有问题。还有LZ的代码目前看来是有问题的,B一旦开始运行将不会停下来的,此时A就不会再运行了。
      

  6.   

    建议LZ把synchronized块写在while(true)外面      while(true) {
             synchronized(obj){
                System.out.println("Got it");
                methodA();
                Thread.sleep(2000);
                methodB();
                obj.notifyAll();
          }
        }