1. import java.util.concurrent.*;
  2. import java.util.concurrent.atomic.AtomicBoolean;
  3. import java.util.concurrent.BlockingQueue;
  4. import java.util.concurrent.LinkedBlockingQueue;
  5. class TaskQueue {
  6. private final BlockingQueue<ArrayTask> taskQueue;
  7. private final ExecutorService executor;
  8. private final AtomicBoolean isRunning = new AtomicBoolean(true);
  9. public TaskQueue(int numThreads) {
  10. this.taskQueue = new LinkedBlockingQueue<>();
  11. this.executor = Executors.newFixedThreadPool(numThreads);
  12. }
  13. public void submitTask(ArrayTask task) {
  14. taskQueue.offer(task); // Add task to the queue
  15. }
  16. public void start() {
  17. for (int i = 0; i < executor.sizer().get(); i++) {
  18. executor.submit(new TaskWorker());
  19. }
  20. }
  21. public void shutdown() {
  22. isRunning.set(false);
  23. executor.shutdown();
  24. try {
  25. executor.awaitTermination(60, TimeUnit.SECONDS); // Wait for tasks to complete
  26. } catch (InterruptedException e) {
  27. Thread.currentThread().interrupt();
  28. }
  29. }
  30. private class TaskWorker implements Runnable {
  31. @Override
  32. public void run() {
  33. while (isRunning.get()) {
  34. try {
  35. ArrayTask task = taskQueue.take(); // Block until a task is available
  36. executeTask(task);
  37. } catch (InterruptedException e) {
  38. Thread.currentThread().interrupt();
  39. break;
  40. }
  41. }
  42. }
  43. private void executeTask(ArrayTask task) {
  44. AtomicBoolean taskSuccess = new AtomicBoolean(false);
  45. int retryCount = 0;
  46. while (!taskSuccess.get() && retryCount < 3) { // Retry logic
  47. try {
  48. if (!task.execute()) {
  49. retryCount++;
  50. System.out.println("Task failed, retrying... (attempt " + retryCount + ")");
  51. Thread.sleep(1000); // Wait before retrying
  52. } else {
  53. taskSuccess.set(true);
  54. System.out.println("Task completed successfully.");
  55. }
  56. } catch (Exception e) {
  57. retryCount++;
  58. System.err.println("Task failed with exception: " + e.getMessage() + ", retrying... (attempt " + retryCount + ")");
  59. Thread.sleep(1000); // Wait before retrying
  60. }
  61. }
  62. if (!taskSuccess.get()) {
  63. System.err.println("Task failed after multiple retries.");
  64. }
  65. }
  66. }
  67. }
  68. class ArrayTask {
  69. private final Runnable task;
  70. public ArrayTask(Runnable task) {
  71. this.task = task;
  72. }
  73. public boolean execute() {
  74. try {
  75. task.run();
  76. return true;
  77. } catch (Exception e) {
  78. return false;
  79. }
  80. }
  81. }

Add your comment