Object.wait永远等待

时间:2019-09-13 16:51:00

标签: java

我在使用Object.notifyAll()Object.wait()时遇到问题。

即使另一个线程已经调用Object.wait()Object.notifyAll()函数也会一直等待。

我尝试使用try而不是catchObject.notify() / Object.notifyAll(),调试输出(显示它已通知,但无限等待)并设置了Object.wait()超时。这些都不能解决我的问题。

    public String run(){
        //Creating the request
        Request request = new Request.Builder().url(this.BaseUrl).build();
        //Enqueuing the request
        this.client.newCall(request).enqueue(new Callback() {

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Response = response.body().string();
                System.out.println(Response);
                synchronized (Response){//We have to do this synchronized
                    Response.notify();//Notifying here
                }
            }
        });

        try{
            //We'll wait until the Response got notified by the callbacks and then return it.
            synchronized (Response){//We have to do this synchronized
                Response.wait();
                return Response;
            }
        }catch(InterruptedException e){
            e.printStackTrace();
            System.out.println(Response);
        }
        return  null;
    }

我得到的错误是...好吧...它永远等待着。

编辑:我尝试使用OkHttp3创建一个简单的Web请求类(不相关。) 这是一个完整的功能,应该相当可重复。 完全一样...它会永远等待。

2 个答案:

答案 0 :(得分:1)

很难准确说明您在做什么以及事件的顺序。以下说明了我相信您正在尝试做的事情。


    public class WaitDemo {
       Object lock = new Object();

       public static void main(String[] args) {
          new WaitDemo().start();
       }
       public void start() {
          new Thread(() ->
          {
             synchronized (lock) {
                try {
                   System.out.println("Waiting...");
                   lock.wait();
                   System.out.println("received notification");
                }
                catch (InterruptedException ie) {
                   ie.printStackTrace();
                }
             }
          }).start();

          try {
             // give thread time to start
             Thread.sleep(3000);
          }
          catch (InterruptedException ie) {
          }
          synchronized (lock) {
             System.out.println("starting");
             lock.notifyAll();
             System.out.println("notified other thread");
          }

       }
    }

答案 1 :(得分:1)

来自问题:

  

Object.wait()函数保持等待状态,即使另一个线程已经已被调用 Object.notifyAll()

notifyAll()的Javadoc说:

  

唤醒所有正在此对象的监视器上等待的线程。线程通过调用wait方法之一来等待对象的监视器。

仅唤醒当前等待中的线程。没有设置标记或执行任何操作,因此在{em {em}}调用之后 调用开始等待的线程将看不到该调用,并且必须等到 next 调用到notifyAll