当前位置: 首页 > 知识库问答 >
问题:

结果却一直没有出现

狄楷
2023-03-14

嗨,我是新来的Java并发,我正在尝试通过分叉连接将列表内容加倍,并将任务分成多个部分。任务完成,但结果从未到达。

package com.learning;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.TimeUnit;

class DoubleNumbers extends RecursiveTask<List<Integer>> {
    private final List<Integer> listToDo;
    public DoubleNumbers(List<Integer> list) {
        System.out.println("Cons Called"+list.get(0));
        this.listToDo = list;
    }

    @Override
    protected List<Integer> compute() {
        List<DoubleNumbers> doubleNumbersList= new ArrayList<>();
        System.out.println(Thread.currentThread().toString());
        for (int i = 0; i < listToDo.size(); i++) {
            listToDo.set(i, listToDo.get(i) * 2);
        }
        return listToDo;
    }
}

public class FJPExample {
    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < 149; i++) {
            arrayList.add(i, i);
        }
        ForkJoinPool forkJoinPool = new ForkJoinPool(4);

        System.out.println(forkJoinPool.getParallelism());
        DoubleNumbers doubleNumbers = new DoubleNumbers(arrayList.subList(0, 49));
        DoubleNumbers doubleNumbers50ToNext = new DoubleNumbers(arrayList.subList(50, 99));
        DoubleNumbers doubleNumbers100ToNext = new DoubleNumbers(arrayList.subList(100, 149));
        forkJoinPool.submit(doubleNumbers);
        forkJoinPool.execute(doubleNumbers50ToNext);
        forkJoinPool.execute(doubleNumbers100ToNext);
        do {
            System.out.println("Parallel " + forkJoinPool.getParallelism());
            System.out.println("isWorking" + forkJoinPool.getRunningThreadCount());
            System.out.println("isQSubmission" + forkJoinPool.getQueuedSubmissionCount());
            try {
                TimeUnit.SECONDS.sleep(1000);
            } catch (InterruptedException e) {
                //
            }
        } while ((!doubleNumbers.isDone()) || (!doubleNumbers50ToNext.isDone()) || (!doubleNumbers100ToNext.isDone()));
        forkJoinPool.shutdown(); // Line 56

        arrayList.addAll(doubleNumbers.join());  
        arrayList.addAll(doubleNumbers50ToNext.join());
        arrayList.addAll(doubleNumbers100ToNext.join());
        System.out.println(arrayList.size());
        arrayList.forEach(System.out::println);
    }
}

如果我调试我的任务,那么我可以发现数字增加了一倍,但结果从未到达第56行

共有1个答案

姜煌
2023-03-14

问题在于代码arrayList。addAll(doubleNumber.join()),第54、55和56行,因为这可能会导致ConcurrentModificationException。所以,你可以做的是,用下面的行替换这些行,它就会工作(这会工作,因为你在第36行使用了arrayList.subList,它由同一个arrayList支持,请阅读它的javadoc以获取更多信息)

doubleNumbers.join();
doubleNumbers50ToNext.join();
doubleNumbers100ToNext.join();
 类似资料:
  • > 我有两个Nexus存储库 我在C:\users\login.m2中有两个settings.xml文件: 发布开发人员快照 在C:\apache-maven-3.2.3\conf: [信息]下载:http://30.30.20.40:8085/nexus/content/repositories/releases/org/apache/httpcomponents/project/4.1.1/p

  • 我已经使用ES一段时间了,但今天不起作用。我重新创建了docker compose(smt可以在那里吗?),以下是我在ES中获得的数据: 编辑:这是我的输入(这里我有\u source=False) 架构: 具有“全部匹配”查询的文档(部分): 现在查询: 退货 知道问题出在哪里吗? 编辑:使用curl查询{“query”:{“bool”:{“must”:[{“match”:{“integer”:

  • 恒生测试岗,运营管理部 一面: 自我介绍,项目介绍 一瓶矿泉水怎么做测试 家庭情况,哪里人,为什么要选择杭州 二面难度比一面大,但整体都能答上来 二面主要问项目的内容, 用什么语言, 项目负责的模块, 为什么要选择测试, 遇到的挑战是什么,怎么解决 有没有和同门互帮互助,有没有测试相关的竞赛,竞赛里的分工是什么 对恒生的了解, 对测试的理解, 支付宝转入余额宝操作,每笔限制5-1w,每天限额10w

  • 这是我索引中的文档(也可以有几个): 从逻辑上讲,我试图建立这个条件: 我的问题(来自kibana): 我正在与上述范围内的字段的范围查询与上面的其他字段进行比较。但没有得到任何命中!我想检索具有在给定和日期。 在这个领域很缺乏经验,不知道为什么不起作用!请帮助如何修复此查询以做到这一点?

  • 我正在尝试从PDF文件中抓取一些数据。我正在使用class.pdf2text.php(在这里找到)(通过一些内部调整),所有工作都很好,但是我有这种非常奇怪的情况。如果我像这样运行代码: 未返回任何内容< code>$bill_date为空。如果我像这样运行代码: 然后打印的所有内容, 是一个包含preg_match结果的数组。正如你可以想象的那样,我无意输出整个内容,我只需要得到preg_mat

  • 我很好奇是否可以在以下情况下使用orElseThrow(),或者是否有更Java的8种方法可以将其等效为1行?