即使在内部执行新线程时,RMI也会阻塞,直到远程方法返回

时间:2017-06-19 15:45:57

标签: java rmi distributed-computing

场景:我有一台服务器将总和问题分发给已注册的计算器。

问题在于,当服务器远程启动计算器时,他会按顺序执行它们(等待每个计算器返回),尽管计算器内的计算应该在一个单独的线程中完成(因此它应该立即返回)。

此外,当我尝试通过将其解析为我的线程类型来获取计算器内部当前执行线程的类型时,我得到错误...如果我在该线程内执行 wait ,则服务器线程而是停下来。

这是我的代码:

解决问题的服务器内的

方法(客户端也远程调用此方法,但我不认为这与发生的事情有关)

@Override
public void solveProblem(Agent a, IClient client) throws RemoteException {
    Runnable thread = new Runnable(){
        @Override
        public void run()
        {
                //some variable initialization...
                for(int i=0;i<calcs.size();i++)
                {
                    try {
                        calcs.get(i).delegate(a, chosen);
                        System.out.println("delegate to "+i+" done");
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
         }
    };
}

计算器:委托方法初始化新线程并开始计算

@Override
public void delegate(Agent a, ICalculator original) throws RemoteException {
    receivedCount=0;
    thread = new CalculationThread(a, original);
    thread.run();
}

CalculationThread是CalculatorImpl类

中的内部类
class CalculationThread extends Thread{
    private Agent a;
    private ICalculator original;
    public String name = "Calculation Thread";
    public CalculationThread(Agent a, ICalculator original) {
        this.a=a;
        this.original=original;
    }
    @Override
    public String toString()
    {
        return "Original Calculation Thread";
    }
    @Override
    public void run()
    {
        //start calculation
        System.out.println("----start new query----");
        double result = 0;
        for(double n=a.lowerBound;n<=a.upperBound;n++)
        {
            result += Math.pow(-1, n)/(2*n+1);
        }
        result = result*4;
        System.out.println("Finished with result("+a.lowerBound+","+a.upperBound+"):"+result);

    }
}

任何机构都可以解释这里的问题是什么?

1 个答案:

答案 0 :(得分:3)

thread.run();

您应该致电start(),而不是run()。目前你只是在当前线程中运行代码。