RMI 阻塞直到远程方法 return 即使新线程正在内部执行
RMI blocks until remote method return even when new thread is executing inside
场景:我有一台服务器将求和问题分发给已注册的计算器。
问题是当服务器远程启动计算器时,他按顺序执行它们(等待每个return)虽然计算器内部的计算应该在一个单独的线程中完成(因此它应该return立即)。
此外,当我尝试通过将其解析为我的线程类型来获取计算器中当前正在执行的线程的类型时,出现错误...如果我在其中执行 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
中的内部 class
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);
}
}
任何人都可以解释这里的问题是什么?
thread.run();
您应该打电话给 start()
,而不是 run()
。目前你只是运行当前线程中的代码。
场景:我有一台服务器将求和问题分发给已注册的计算器。
问题是当服务器远程启动计算器时,他按顺序执行它们(等待每个return)虽然计算器内部的计算应该在一个单独的线程中完成(因此它应该return立即)。
此外,当我尝试通过将其解析为我的线程类型来获取计算器中当前正在执行的线程的类型时,出现错误...如果我在其中执行 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
中的内部 classclass 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);
}
}
任何人都可以解释这里的问题是什么?
thread.run();
您应该打电话给 start()
,而不是 run()
。目前你只是运行当前线程中的代码。