我在使用Object.notifyAll()
和Object.wait()
时遇到问题。
即使另一个线程已经调用Object.wait()
,Object.notifyAll()
函数也会一直等待。
我尝试使用try
而不是catch
来Object.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请求类(不相关。) 这是一个完整的功能,应该相当可重复。 完全一样...它会永远等待。
答案 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
。