如果我们使用对象引用调用notify,将通知哪个线程

时间:2016-05-05 04:56:05

标签: java multithreading

我们知道wait()notify()是在Object类中定义的,因为监视器将设置在Object而不是该对象的特定线程上,所以我的问题是我们写

MyObject mo=new MyObject();
Thread t1=new Thread(c);
Thread t2=new Thread(c);
try {
t1.wait();

c.notify();
}catch(Exception e){}

如果我们使用对象引用调用notify,如上面的线程t1或t2,将通知哪个线程。

1 个答案:

答案 0 :(得分:2)

waitnotify使用相同的对象。如果xObject,则线程t1执行此操作:

x.wait();

然后当另一个线程稍后在相同的 Object上使用它时:

x.notify();

然后会通知t1,因为它是等待x的线程。 (假设没有其他线程在同一个对象上执行wait。如果有多个线程在等待,系统将选择一个。)

您的错误在于尝试在wait对象上使用Thread

t1.wait();

这是合法的,因为您可以在wait() ObjectThreadObjectObject。但这是毫无意义的,而不是正常的做事方式。声明一些其他对象用作两个线程用于同步的监视器更为正常。但那个其他对象可以是任何东西。它可能很简单Object synchronizePoint;

<ul class="list-unstyled uploadedimg_list">
  <li class="uploadedimg_item">
    <div>
      <span class="image-wrapper"><img src=
                "http://sdtimes.com/wp-content/uploads/2015/08/0827.sdt-blog-google.png"></span>
    </div>
  </li>
  ...
</ul>



$('.uploadedimg_list').sortable({
  helper: 'clone',
  start: function(e, ui){
    ui.placeholder.height(ui.item.height());
  }
});

但通常它是一些其他对象,它是所有线程正在处理的主要对象之一,使其成为一个方便的对象,用于同步而无需声明新的。