新的多线程 - 如何在java中使用wait()和notify()?

时间:2010-07-19 03:10:01

标签: java multithreading 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;
    }
}

1 个答案:

答案 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。但这两者都需要你重新设计你目前的想法。

相关问题