package com.constellio.sdk.tests.concurrent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
public class ConcurrencyUtils {
public static void concurrentIntegerFor(int nbthreads, int start, int end, int increment, final IncrementForTask task,
final WorkerContextFactory workerContextFactory) {
final LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>((int) Math.ceil((end - start) / increment));
for (int i = start; i < end; i += increment) {
queue.add(i);
}
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < nbthreads; i++) {
final int workerId = i;
threads.add(new Thread() {
@Override
public void run() {
Map<String, Object> context = new HashMap<String, Object>();
workerContextFactory.setupWorkerContext(workerId, context);
Integer nextTask;
while ((nextTask = queue.poll()) != null) {
task.executeTask(nextTask, context);
}
}
});
}
for (Thread thread : threads) {
thread.start();
}
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public interface IncrementForTask {
void executeTask(int i, Map<String, Object> workerContext);
}
public interface WorkerContextFactory {
void setupWorkerContext(int worker, Map<String, Object> workerContext);
}
}