-
-
Notifications
You must be signed in to change notification settings - Fork 22
Iterating collections and arrays in parallel by setting thread priority
Roberto Gentili edited this page Dec 9, 2021
·
6 revisions
Through the underlying configurable BackgroundExecutor the IterableObjectHelper component is able to iterate a collection or an array in parallel and execute an action on each iterated item giving also the ability to set the threads priority:
import static org.burningwave.core.assembler.StaticComponentContainer.IterableObjectHelper;
import static org.burningwave.core.assembler.StaticComponentContainer.ManagedLoggerRepository;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.burningwave.core.iterable.IterableObjectHelper.IterationConfig;
public class CollectionAndArrayIterator {
public static void execute() {
List<String> output = IterableObjectHelper.iterateAndGet(
IterationConfig.of(buildCollection())
//Enabling parallel iteration when the input collection size is greater than 2
.parallelIf(inputColl -> inputColl.size() > 2)
//Setting threads priority
.withPriority(Thread.MAX_PRIORITY)
//Setting up the output collection
.withOutput(new ArrayList<String>())
.withAction((number, outputCollectionSupplier) -> {
if (number > 500000) {
//Terminating the current thread iteration early.
IterableObjectHelper.terminateCurrentThreadIteration();
//If you need to terminate all threads iteration (useful for a find first iteration) use
//IterableObjectHelper.terminateIteration();
}
if ((number % 2) == 0) {
outputCollectionSupplier.accept(outputCollection ->
//Converting and adding item to output collection
outputCollection.add(number.toString())
);
}
})
);
IterableObjectHelper.iterate(
IterationConfig.of(output)
//Disabling parallel iteration
.parallelIf(inputColl -> false)
.withAction((number) -> {
ManagedLoggerRepository.logInfo(CollectionAndArrayIterator.class::getName, "Iterated number: {}", number);
})
);
ManagedLoggerRepository.logInfo(
CollectionAndArrayIterator.class::getName,
"Output collection size {}", output.size()
);
}
private static Collection<Integer> buildCollection() {
Collection<Integer> inputCollection = new ArrayList<>();
for (int i = 1; i <= 1000000; i++) {
inputCollection.add(i);
}
return inputCollection;
}
public static void main(String[] args) {
execute();
}
}
Burningwave core is a fully indipendent, advanced, free and open source Java frameworks building library that contains AN EXTREMELY POWERFUL CLASSPATH SCANNER.
To include Burningwave Core library in your projects simply use with Apache Maven:
<dependency>
<groupId>org.burningwave</groupId>
<artifactId>core</artifactId>
<version>12.65.2</version>
</dependency>
To use Burningwave Core as a Java module add the following to your module-info.java
:
requires org.burningwave.core;
ClassFactory
ClassHunter
- In depth look to and configuration guide
- USE CASE: retrieving all classes of the classpath
- USE CASE: retrieving all classes that implement one or more interfaces
- USE CASE: finding all classes that extend a base class
- USE CASE: searching for all classes that have package name that matches a regex
- USE CASE: finding all classes for module name (Java 9 and later)
- USE CASE: finding all annotated classes
- USE CASE: how to scan classes for specific annotations and collect its values
- USE CASE: searching for all classes with a constructor that takes a specific type as first parameter and with at least 2 methods that begin for a given string
- USE CASE: searching for all classes with methods whose name begins for a given string and that takes a specific type as its first parameter
- USE CASE: finding all classes that have at least 2 protected fields