我如何使用wait/notifyAll

use*_*608 6 java multithreading notify wait runnable

我想知道在java中是否有可能有一个实现Runnable的类,如果该类的对象进入wait()(所以线程停止运行直到它收到一个信号),同一个类的另一个对象可以通知它继续跑步?

理想情况下,我希望能够做到的是:

public class ThreadClass implements Runnable{

 public void run(){
 //.. Does some arbitrary work

  if( aCondition){  //have it wait until something signals it to contine exection.
 this.wait();
 }

 //Continues to do more work.

 //finished whatever it needed to do. Signal all other threads of this object type to continue their work.
 this.notifyAll();

 }
}
Run Code Online (Sandbox Code Playgroud)

这是可能的,如果是这样,我该怎么做呢?我试图使它成为对象本身可以管理自己和所有其他相同类型的对象.所以没有人使用这个类必须担心管理它.

Jon*_*eet 6

我试图使它成为对象本身可以管理自己和所有其他相同类型的对象.所以没有人使用这个类必须担心管理它.

如果你想让每个实例都知道每个其他实例,你需要某种静态集合......这会使垃圾收集变得棘手,并且使得它很难测试.

我建议你有一个单独的管理员类型,其唯一的工作是管理这个类的实例.然后你仍然只需要在一个地方拥有逻辑,但你不需要知道所有类型的实例 - 经理只需要知道它在管理什么.您甚至可以创建API,以便客户端代码需要查看管理器,并隐藏单个实例.

编辑:只是为了澄清,你甚至可能根本不需要wait/ notifyAll更喜欢更高级别的构造java.util.concurrent,它允许你编写生产者/消费者场景而不需要低级操作wait.这个答案解决了让对象知道应该与哪些其他对象进行通信的更高级别的问题.一个类型的所有对象知道另一个对象的问题的想法将导致问题,因此建议经理类.