Vipul Pandey
Vipul Pandey

Reputation: 1738

ForkJoinPool result never arrived

Hi I am new to Java concurrency and I am trying to Double the List Content by fork join and dividing the task into multiple parts. The task gets Completed but result never arrived.

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);
    }
}

If I debug my task then I am able to find the numbers gets doubled but the result never arrived at line no 56

Upvotes: 0

Views: 159

Answers (1)

Satish
Satish

Reputation: 1065

Issue is with the code arrayList.addAll(doubleNumbers.join()) , line# 54, 55 and 56 because this may result into ConcurrentModificationException. So, what you can do is, replace these lines with below lines and it will work(it will work because you have used arrayList.subList at line #36 which is backed by same arraylist, read its javadoc for more info)

doubleNumbers.join();
doubleNumbers50ToNext.join();
doubleNumbers100ToNext.join();

Upvotes: 1

Related Questions