com.gs.collections.impl.parallel.ParallelArrayIterate Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gs-collections Show documentation
Show all versions of gs-collections Show documentation
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.
/*
* 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