【问题标题】:new to multithreading- how to use wait() and notify() in java?多线程新手 - 如何在 java 中使用 wait() 和 notify()?
【发布时间】:2010-07-19 03:10:00
【问题描述】:

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

【问题讨论】:

    标签: java multithreading wait notify


    【解决方案1】:

    您需要在调用notify() 之前获取this 上的监视器。 此外,当您调用 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。但这两者都需要您重新设计您当前的想法。

    【讨论】:

    • 让我站在大多数人的一边,建议不要使用低级线程同步原语,而是使用并发包。至少看看 BlockingQueue 看看你是否喜欢它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多