import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
class TaskQueue {
private final BlockingQueue<ArrayTask> taskQueue;
private final ExecutorService executor;
private final AtomicBoolean isRunning = new AtomicBoolean(true);
public TaskQueue(int numThreads) {
this.taskQueue = new LinkedBlockingQueue<>();
this.executor = Executors.newFixedThreadPool(numThreads);
}
public void submitTask(ArrayTask task) {
taskQueue.offer(task); // Add task to the queue
}
public void start() {
for (int i = 0; i < executor.sizer().get(); i++) {
executor.submit(new TaskWorker());
}
}
public void shutdown() {
isRunning.set(false);
executor.shutdown();
try {
executor.awaitTermination(60, TimeUnit.SECONDS); // Wait for tasks to complete
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
private class TaskWorker implements Runnable {
@Override
public void run() {
while (isRunning.get()) {
try {
ArrayTask task = taskQueue.take(); // Block until a task is available
executeTask(task);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}
private void executeTask(ArrayTask task) {
AtomicBoolean taskSuccess = new AtomicBoolean(false);
int retryCount = 0;
while (!taskSuccess.get() && retryCount < 3) { // Retry logic
try {
if (!task.execute()) {
retryCount++;
System.out.println("Task failed, retrying... (attempt " + retryCount + ")");
Thread.sleep(1000); // Wait before retrying
} else {
taskSuccess.set(true);
System.out.println("Task completed successfully.");
}
} catch (Exception e) {
retryCount++;
System.err.println("Task failed with exception: " + e.getMessage() + ", retrying... (attempt " + retryCount + ")");
Thread.sleep(1000); // Wait before retrying
}
}
if (!taskSuccess.get()) {
System.err.println("Task failed after multiple retries.");
}
}
}
}
class ArrayTask {
private final Runnable task;
public ArrayTask(Runnable task) {
this.task = task;
}
public boolean execute() {
try {
task.run();
return true;
} catch (Exception e) {
return false;
}
}
}
Add your comment