新的multithreading – 如何在java中使用wait()和notify()?

我正在尝试编写一个包含2个类的程序,一个控制器和一个执行大量计算的类。 控制器创建另一个类的几个实例,然后告诉他们所有人开始计算(并行)。 它们在完成时都返回,控制器恢复,然后,一段时间后,控制器将新数据传递给它们,让它们再次运行计算。
理想情况下,我可以使用参数调用start(),但这是不可能的,因此控制器调用计算器中的方法将数据存储在全局中,然后启动计算线程并返回,直到我尝试再次启动线程,它告诉我线程已经死了。 所以我试图使运行成为一个无限循环,等待通知,运行计算,将结果存储在全局中,以便控制器可以在以后检索它们,然后重新开始等待。 所以类似于:

//in controller: Calculator calc=new Calculator(); calc.runCalculations(data); while(calc.isCalculating()){ //do nothing } System.out.println("results: "+calc.getAnswer()); calc.runCalculations(data2); //in calculator: public runCalculations(Data data){ globalData=data; this.notify(); } public void run(){ while(true){ synchronized(this){ wait(); } calculating=true; globalData=calculate(globalData); calculating=false; } } 

您需要在调用notify()之前获取此监视器。 此外,当您调用wait()您应该在循环中执行此操作,该循环检查条件以确定您没有经历过虚假唤醒。

 public runCalculations(Data data){ globalData=data; synchronized(this) { calculating=true; this.notify(); } } public void run(){ while(true){ synchronized(this){ calculating=false; while(!calculating) { wait(); } } globalData=calculate(globalData); } } 

一般来说,大多数人会建议不要使用wait / notify,而是建议您使用Executor或至少使用BlockingQueue。 但这两者都需要你重新设计你当前的想法。