首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ForkJoinPool结果从未到达

ForkJoinPool结果从未到达
EN

Stack Overflow用户
提问于 2020-02-03 16:53:28
回答 1查看 51关注 0票数 0

您好,我是Java并发的新手,我正在尝试通过fork join和将任务分成多个部分来使列表内容加倍。任务已完成,但结果从未到达。

代码语言:javascript
复制
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行

EN

回答 1

Stack Overflow用户

发布于 2020-02-03 17:17:09

代码arrayList.addAll(doubleNumbers.join())、line# 54、55和56存在问题,因为这可能会导致ConcurrentModificationException。所以,你可以做的是,用下面的代码行替换这些代码行,它将会工作(它会工作,因为你已经在第36行使用了arrayList.subList,它是由相同的数组列表支持的,阅读它的javadoc以获得更多信息)

代码语言:javascript
复制
doubleNumbers.join();
doubleNumbers50ToNext.join();
doubleNumbers100ToNext.join();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60035833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档