Java tutorial
import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Main { int[] itemsToBeProcessed; public static void main(String[] args) { new Main(32).processUsers(4); } public Main(int size) { itemsToBeProcessed = new int[size]; } public void processUsers(int numOfWorkerThreads) { ExecutorService threadPool = Executors.newFixedThreadPool(numOfWorkerThreads); int chunk = itemsToBeProcessed.length / numOfWorkerThreads; int start = 0; List<Future> tasks = new ArrayList<Future>(); for (int i = 0; i < numOfWorkerThreads; i++) { tasks.add(threadPool.submit(new WorkerThread(start, start + chunk))); start = start + chunk; } // join all worker threads to main thread for (Future f : tasks) { try { f.get(); } catch (Exception e) { e.printStackTrace(); } } threadPool.shutdown(); while (!threadPool.isTerminated()) { } } } class WorkerThread implements Callable { int startIndex, endIndex; public WorkerThread(int startIndex, int endIndex) { this.startIndex = startIndex; this.endIndex = endIndex; } @Override public Object call() throws Exception { for (int currentUserIndex = startIndex; currentUserIndex < endIndex; currentUserIndex++) { // Add your logic here System.out.println(currentUserIndex + " is the user being processed in thread " + Thread.currentThread().getName()); } return null; } }