在Java中分割ArrayList并将其传递给不同的线程
我正在尝试将ArrayList划分为多个线程,以便它们稍后可以执行RMI调用。然而,即使在任何RMI开始之前,我也无法将子列表作为参数传递。以下程序的输出为:在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.
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