<groupId>de.ddnss.eternal.utils</groupId>
<artifactId>utils</artifactId>
- <version>1.3.3</version>
+ <version>1.4.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
--- /dev/null
+package de.ddnss.eternal.utils.threading;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+public class ParallelProcessor {
+
+ public static void run(Runnable function, int threads) {
+ ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(threads);
+ for (int i = 0; i < threads; i++) {
+ executor.submit(function);
+ }
+ }
+
+ /**
+ * Runs the given task repeatedly using the given number of threads until
+ * the provided condition becomes true.
+ */
+ public static void runUntil(Runnable task, int threads, Supplier<Boolean> stopCondition) {
+ ExecutorService executor = Executors.newFixedThreadPool(threads);
+
+ for (int i = 0; i < threads; i++) {
+ executor.submit(() -> {
+ while (!stopCondition.get()) {
+ task.run();
+ }
+ });
+ }
+
+ executor.shutdown();
+
+ try {
+ executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+}