划分ArrayList并将其传递给Java中的不同线程

时间:2017-05-19 17:20:19

标签: java multithreading arraylist

我试图将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();
        }
    }
}

谢谢!

1 个答案:

答案 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();
        }
    }
}
相关问题