Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中分割ArrayList并将其传递给不同的线程_Java_Multithreading_Arraylist - Fatal编程技术网

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

在Java中分割ArrayList并将其传递给不同的线程,java,multithreading,arraylist,Java,Multithreading,Arraylist,我正在尝试将ArrayList划分为多个线程,以便它们稍后可以执行RMI调用。然而,即使在任何RMI开始之前,我也无法将子列表作为参数传递。以下程序的输出为: get(1): 28.833612828660367 get(1): 28.833612828660367 而我希望数字会有所不同。这意味着每个线程都接收完全相同的数组。我对Java了解不多,所以可能会有什么问题 在下面的代码中,N是数组中的总元素数,K是程序应该启动的线程数 package rmi; import java.rmi.

我正在尝试将ArrayList划分为多个线程,以便它们稍后可以执行RMI调用。然而,即使在任何RMI开始之前,我也无法将子列表作为参数传递。以下程序的输出为:

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();
        }
    }
}
包rmi;
导入java.rmi.Naming;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.ThreadLocalRandom;
公共类客户端{
专用静态最终整数N=10;
私有静态最终整数K=2;
公共静态void main(字符串[]args){
ArrayList向量=新的ArrayList();

对于(int j=0;j只需从
ClientThread
类的
vector
字段中删除static

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();
        }
    }
}
类ClientThread扩展线程{
私有列表向量;
公共客户端线程(列表向量arg){
向量=向量arg;
}
@凌驾
公开募捐{
试一试{
服务s=(服务)命名。查找(“rmi://localhost:1099/Servico");
System.out.println(“get(1):”+vector.get(1));
}捕获(例外e){
e、 printStackTrace();
}
}
}

只需从
ClientThread
类的
vector
字段中删除static

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();
        }
    }
}
类ClientThread扩展线程{
私有列表向量;
公共客户端线程(列表向量arg){
向量=向量arg;
}
@凌驾
公开募捐{
试一试{
服务s=(服务)命名。查找(“rmi://localhost:1099/Servico");
System.out.println(“get(1):”+vector.get(1));
}捕获(例外e){
e、 printStackTrace();
}
}
}

我不确定我是否理解这种安排的目的。与其拆分列表,不如使用线程安全的集合,每个线程都可以从中获取数据。我尝试制作一个ArrayList(我能想到的最好的事情是列表列表),并将每个独立数组传递给每个线程。结果是一样的。这可能与生成随机数的方式有关吗?该程序背后的思想是允许通过每个线程内的RMI调用并行处理数组,从而加快处理速度。该部分是从上面的代码中抽象出来的。您可以uld使用线程间共享的并发队列来实现相同的目的。子列表分区目前看起来不太正确。你是对的,我认为这会起作用。但是,我可能不得不担心同步对队列的访问,对吗?我可能会尝试一下,但很想理解为什么上面的代码不起作用k、 我不确定我是否理解这种安排的目的。与其拆分列表,不如使用线程安全的集合,每个线程都可以从中获取数据。我尝试制作一个ArrayList(我能想到的最好的事情是列表列表),并将每个独立数组传递给每个线程。结果是一样的。这可能与生成随机数的方式有关吗?该程序背后的思想是允许通过每个线程内的RMI调用并行处理数组,从而加快处理速度。该部分是从上面的代码中抽象出来的。您可以uld使用线程间共享的并发队列来实现相同的目的。子列表分区目前看起来不太正确。你是对的,我认为这会起作用。但是,我可能不得不担心同步对队列的访问,对吗?我可能会尝试一下,但很想理解为什么上面的代码不起作用K