All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gs.collections.impl.parallel.ParallelArrayIterate Maven / Gradle / Ivy

Go to download

GS Collections is a collections framework for Java. It has JDK-compatible List, Set and Map implementations with a rich API and set of utility classes that work with any JDK compatible Collections, Arrays, Maps or Strings. The iteration protocol was inspired by the Smalltalk collection framework.

There is a newer version: 7.0.3
Show newest version
/*
 * Copyright 2011 Goldman Sachs.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.gs.collections.impl.parallel;

import java.util.concurrent.Executor;

import com.gs.collections.api.block.procedure.Procedure;
import com.gs.collections.impl.utility.ArrayIterate;

import static com.gs.collections.impl.factory.Iterables.*;

/**
 * The ParallelArrayIterate class contains a parallel forEach algorithm that work with Java arrays.  The forEach
 * algorithm employs a batching fork and join approach approach.  All Collections that are not array based use
 * ParallelArrayIterate to parallelize, by converting themselves to an array using toArray().
 */
public final class ParallelArrayIterate
{
    private ParallelArrayIterate()
    {
        throw new AssertionError("Suppress default constructor for noninstantiability");
    }

    public static > void forEach(
            T[] array,
            ProcedureFactory procedureFactory,
            Combiner combiner)
    {
        int taskCount = Math.max(ParallelIterate.DEFAULT_PARALLEL_TASK_COUNT, array.length / ParallelIterate.DEFAULT_MIN_FORK_SIZE);
        ParallelArrayIterate.forEach(array, procedureFactory, combiner, ParallelIterate.DEFAULT_MIN_FORK_SIZE, taskCount);
    }

    public static > void forEach(
            T[] array,
            ProcedureFactory procedureFactory,
            Combiner combiner,
            int minForkSize,
            int taskCount)
    {
        ParallelArrayIterate.forEachOn(array, procedureFactory, combiner, minForkSize, taskCount, ParallelIterate.EXECUTOR_SERVICE);
    }

    public static > void forEachOn(
            T[] array,
            ProcedureFactory procedureFactory,
            Combiner combiner,
            int minForkSize,
            int taskCount,
            Executor executor)
    {
        if (ArrayIterate.notEmpty(array))
        {
            int size = array.length;
            if (size < minForkSize)
            {
                BT procedure = procedureFactory.create();
                ArrayIterate.forEach(array, procedure);
                ParallelArrayIterate.combineSingleProcedure(combiner, procedure);
            }
            else
            {
                int threadCount = Math.min(size, taskCount);
                new ArrayProcedureFJTaskRunner(combiner, threadCount).executeAndCombine(executor, procedureFactory, array);
            }
        }
    }

    private static > void combineSingleProcedure(Combiner combiner, BT procedure)
    {
        if (combiner.useCombineOne())
        {
            combiner.combineOne(procedure);
        }
        else
        {
            combiner.combineAll(iList(procedure));
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy