java中wait()和notifyall()的多线程行为?

t3psigkw  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(239)

请注意,这不是实际的场景。我根据实际实现创建了一个示例场景,以便于查看。而且我也已经获得了预期的输出。但我需要澄清一些有关java中wait()和notifyall()的概念。[在这里,这两个线程将从主线程中的run方法开始据我所知,由于线程b处于休眠状态,因为在初始阶段可以看到铰孔数是400。
所以线程b会调用 MUTEX.wait() 然后继续休眠,直到其他线程调用notify()或notifyall(),所以在remainingcount减为0之后,线程将调用 MUTEX.notifyAll(); 唤醒线b和 MUTEX.wait() 释放它已经被授予的锁并进入睡眠状态,直到线程b通知它 MUTEX.notifyAll() 通过线程a,线程b不会在线程a调用之前唤醒并继续它的任务吗 MUTEX.wait() .
我的意思是你可以看到线程a调用 MUTEX.notifyAll() 线程b将唤醒并再次检查while循环中的条件是真是假。因此,由于remainingcount等于0,线程b将退出while循环并在线程a调用wait()之前继续它的任务。所以这个场景不会破坏wait()的原理吗?因为据我所知,线程b只能在线程a调用wait()时继续执行。

public class A implements Runnable{

    public static volatile remainingCount =400;
    private final Object MUTEX;//Both class A and B holds the same object mutex

    private void methodA(){

         synchronized(MUTEX){

              while(remainingCount == 0){

                     MUTEX.notifyAll();
                     MUTEX.wait();
              }

              //Perform it's usual task.In here remaining count will decrement during the process.

        }
      @Override
      public void run() {

        while(true){
          methodA();
        }
     }
   }
}
public class B implements Runnable{

         private final Object MUTEX;//Both class A and B holds the same object mutex

         private void methodB(){
              synchronized(MUTEX){

                   while (A.remainingCount != 0) {
                        try {

                               MUTEX.wait();

                        } catch (InterruptedException ex) {
                               Logger.getLogger(InkServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
                        }
                   }
                      //incrementing the A.remainingCount 

                      MUTEX.notifyAll();

            }

           @Override
           public void run() {

                  while(true){
                     methodB();

                   }
             }
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题