Implementation Workflow
This approach replaces sequential for loop execution with parallel task processing via a thread pool, reducing total runtime for CPU or I/O bound workloads.
Step 1: Confgiure the Thread Pool
First, create a managed thread pool to control concurrent thread usage. Avoid unbounded thread creasion to prevent resource exhaustion:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// Create a fixed-size thread pool aligned with available CPU cores
ExecutorService parallelTaskPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
Step 2: Wrap Loop Iterations as Concurrent Tasks
Convert each iteration of your original for loop into an independent Runnable task, then submit all tasks to the pool:
// Sample input data for the original loop
int[] targetDataSet = new int[75];
for (int i = 0; i < targetDataSet.length; i++) {
targetDataSet[i] = i * 2;
}
// Rewrite sequential loop to parallel task submissions
for (int item : targetDataSet) {
Runnable loopIterationTask = new Runnable() {
@Override
public void run() {
// Insert your original loop body logic here
performComputation(item);
}
};
parallelTaskPool.submit(loopIterationTask);
}
Step 3: Manage Pool Lifecycle
Properly shut down the thread pool after task submission to release system resources, and optionally wait for all tasks to complete:
import java.util.concurrent.TimeUnit;
parallelTaskPool.shutdown();
try {
// Wait up to 10 minutes for all pending tasks to finish
if (!parallelTaskPool.awaitTermination(10, TimeUnit.MINUTES)) {
// Force immediate shutdown if tasks exceed the timeout
parallelTaskPool.shutdownNow();
}
} catch (InterruptedException ex) {
parallelTaskPool.shutdownNow();
Thread.currentThread().interrupt();
}
Full Working Code Example
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ParallelForLoopDemo {
public static void main(String[] args) {
// Initialize thread pool using available CPU core count for optimal performance
ExecutorService taskPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
// Initialize test data set
int[] processingData = new int[100];
for (int i = 0; i < processingData.length; i++) {
processingData[i] = i;
}
// Submit parallel tasks for each loop iteration
for (int currentValue : processingData) {
Runnable task = () -> {
// Replace with your custom processing logic
long result = currentValue * currentValue;
System.out.printf("Computed square of %d: %d on thread %s%n",
currentValue, result, Thread.currentThread().getName());
};
taskPool.submit(task);
}
// Clean up thread pool resources
taskPool.shutdown();
try {
if (!taskPool.awaitTermination(5, TimeUnit.MINUTES)) {
taskPool.shutdownNow();
}
} catch (InterruptedException e) {
taskPool.shutdownNow();
Thread.currentThread().interrupt();
}
}
}