Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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

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 带有索引的IndexOutOfBoundsException<;使用多线程调整大小 问题_Java_Multithreading_Mapreduce - Fatal编程技术网

Java 带有索引的IndexOutOfBoundsException<;使用多线程调整大小 问题

Java 带有索引的IndexOutOfBoundsException<;使用多线程调整大小 问题,java,multithreading,mapreduce,Java,Multithreading,Mapreduce,使用线程并获取java.lang.IndexOutOfBoundsException:索引1超出某些线程长度0的界限,而其他线程执行正常。调试异常时,问题似乎是Arraylist类中的get(index int) public E get(int index) { Objects.checkIndex(index, size); return elementData(index); } Objects.checkIndex(index,size)传递了正

使用线程并获取
java.lang.IndexOutOfBoundsException:索引1超出某些线程长度0的界限,而其他线程执行正常。调试异常时,问题似乎是Arraylist类中的
get(index int)

public E get(int index) {
        Objects.checkIndex(index, size);
        return elementData(index);
    }
Objects.checkIndex(index,size)
传递了正确的值(在本例中,size为9,index为1),但在Objects类中,size参数为0

代码 程序正在尝试实现MapReduce,下面是reduce线程的开始代码

Thread t = new Thread(() ->  {

            for(int i=0; i<words.size();i++ ){
              reduce(words.get(i), lists.get(i), reduceCallback);
            }
          });
Thread t=新线程(()->{

对于(int i=0;i)您没有将
size
传递到
get(int index)
中,那么该值从何而来?
public E get(int index)
位于java.util.ArrayList中,因此size只是该类
对象中的
私有int size
。checkIndex(index,size)传递了正确的值(在本例中,大小为9,索引为1)但是在Objects类中,size参数是0。
这是不可能的,并且可能是在多线程环境中调试的问题。
单词
列表
大小是否会不同?啊,我明白你的意思了。你一定是在修改
列表
或者对该数组中实际存在的任何字符串。有多少个“字符串列表列表”你在迭代吗?是的,如果
单词数
列表数
不同,可能会发生这种情况。@macrofox修改列表似乎是个问题。创建线程后,我立即清除了列表,这可能是对象中size==0的原因。我创建了一个本地threadLists变量,它似乎我已经解决了这个问题。谢谢
public static void reduce(String word, List<String> list, ReduceCallback<String, String, Integer> callback) {

    Map<String, Integer> reducedList = new HashMap<>();
    for(String file: list) {
      reducedList.merge(file, 1, Integer::sum);
    }
    callback.reduceDone(word, reducedList);
  }
final ReduceCallback<String, String, Integer> reduceCallback = new ReduceCallback<>() {
        @Override
        public synchronized void reduceDone(String k, Map<String, Integer> v) {
          output.put(k, v);
        }
      };