我试图将ArrayList划分为多个线程,以便稍后执行RMI调用。但是,即使在任何RMI开始之前,我也无法将subList作为参数传递。以下程序的输出是:
get(1): 28.833612828660367
get(1): 28.833612828660367
我希望数字不同。这意味着每个线程都接收完全相同的数组。我不太了解Java,所以可能是什么问题?
在下面的代码中,N是数组中元素的总数,K是程序应该启动的线程数。
package rmi;
import java.rmi.Naming;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class Client {
private static final int N = 10;
private static final int K = 2;
public static void main(String[] args) {
ArrayList<Double> vector = new ArrayList<>();
for (int j=0; j<N; j++){
vector.add(ThreadLocalRandom.current().nextDouble(1, 100));
}
for (int i=0; i<K; i++){
new ClientThread(vector.subList(i*N/K, i*N/K+N/K-1)).start();
}
}
}
class ClientThread extends Thread{
private static List<Double> vector;
public ClientThread(List<Double> vectorArg){
vector = vectorArg;
}
@Override
public void run(){
try {
Service s = (Service) Naming.lookup("rmi://localhost:1099/Servico");
System.out.println("get(1): "+vector.get(1));
} catch (Exception e) {
e.printStackTrace();
}
}
}
谢谢!
答案 0 :(得分:2)
只需从vector
类
ClientThread
中删除静态内容
class ClientThread extends Thread {
private List<Double> vector;
public ClientThread(List<Double> vectorArg) {
vector = vectorArg;
}
@Override
public void run() {
try {
Service s = (Service) Naming.lookup("rmi://localhost:1099/Servico");
System.out.println("get(1): " + vector.get(1));
} catch (Exception e) {
e.printStackTrace();
}
}
}