Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java wait()notify()未按预期工作_Java_Android_Multithreading_Wait_Notify - Fatal编程技术网

Java wait()notify()未按预期工作

Java wait()notify()未按预期工作,java,android,multithreading,wait,notify,Java,Android,Multithreading,Wait,Notify,我有一个MyService类,它包含一个嵌套的BroadcastReceiver类: public class MyService { private Object lock; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { synchronized(loc

我有一个
MyService
类,它包含一个嵌套的
BroadcastReceiver
类:

public class MyService {
   private Object lock;
   public class MyReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
         synchronized(lock) {
           doTask();
           lock.wait();
           Log.d(TAG, "After wait ...");
         }
      }
   } 
   private synchronized void doTask() {
      Log.d(TAG, "do task ...");
      synchronized(lock) {
          lock.notify();
      }
   }
}
如上所述,当调用
onReceive()
时,我的代码在
synchronized
块中运行
doTask()
。然后,在
doTask()
函数中,我的代码运行
lock.notify()
。我希望看到登录终端
log.d(标记“After wait…”)

我运行我的Android项目。触发onReceive()时,我可以看到日志“执行任务…””,然后,它挂在那里,我看不到日志“等待后…””,为什么我的等待通知没有按预期工作

我运行我的Android项目。触发onReceive()时,我可以看到 日志“做任务…”,然后,它挂在那里,我看不到日志“后 等待…,为什么我的等待通知未按预期工作


BroadcastReceiver
s始终在ui线程上运行。如果
MyService
在Ui线程上运行,您将遇到死锁。也可能是
MyService
在后台线程上运行。如果在等待之前执行通知,则运行MyService的线程正在等待下一个通知

同一线程正在调用这两个方法?可能是“丢失通知”
lock.notify()
不会执行任何操作,除非其他线程已经在
lock.wait()调用中等待。