0

Je travaille actuellement sur l'application Java qui a un scénario de plusieurs producteurs ajoutant des tâches à une file d'attente et chaque fois que la file d'attente n'est pas vide, les tâches doivent être exécutées à un débit prédéfini. (en utilisant plusieurs threads pour maintenir le taux d'exécution) Après l'exécution des tâches disponibles, l'exécuteur doit attendre de nouveau les tâches disponibles dans la file d'attente.Trigger SheduledExecutor avec blockingQueue Java

Je sais que blockingQueue peut être utilisé pour déclencher une partie ici et ScheduledExecutorService pour exécuter des tâches à débit fixe. Mais je ne pouvais pas trouver un moyen de lier la capacité de ces deux pour mon besoin. Donc, je serais très reconnaissant si vous pouviez me donner des suggestions pour que cela se produise.

+0

Quel est le taux prédéfini auquel les tâches doivent être exécutées si le la file d'attente de tâches est non vide? Ne voudriez-vous pas simplement exécuter les tâches dès que vous le pouvez? – rohitvats

Répondre

0

La file d'attente de tâches doit être accessible à la fois par les threads producteur et consommateur. J'ai écrit un programme de base pour démontrer, mais je vais vous laisser jouer avec l'API BlockingQueue et ScheduledExecutor selon vos besoins:

import java.util.concurrent.*; 


public class ProducerConsumer { 
    private static final BlockingQueue<Integer> taskQueue = new LinkedBlockingQueue<>(); 

    public static void main(String[] args) { 
     ExecutorService consumers = Executors.newFixedThreadPool(3); 
     consumers.submit(new Consumer()); 
     consumers.submit(new Consumer()); 
     consumers.submit(new Consumer()); 

     ExecutorService producers = Executors.newFixedThreadPool(2); 
     producers.submit(new Producer(1)); 
     producers.submit(new Producer(2)); 
    } 

    private static class Producer implements Runnable { 
     private final int task; 

     Producer(int task) { 
      this.task = task; 
     } 

     @Override 
     public void run() { 
      System.out.println("Adding task: " + task); 
      taskQueue.add(task); // put is better, since it will block if queue is full 
     } 
    } 

    private static class Consumer implements Runnable { 
     @Override 
     public void run() { 
      try { 
       Integer task = taskQueue.take(); // block if there is no task available 
       System.out.println("Executing task: " + task); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}