我正在尝试编写一个包含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;
}
}
答案 0 :(得分:4)
在致电this
之前,您需要在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。但这两者都需要你重新设计你目前的想法。