2

我正在尝试编写一个包含 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;
    }
}
4

1 回答 1

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);
    }
}

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

于 2010-07-19T03:21:46.240 回答