0

В настоящее время я работаю над java-приложением, которое имеет сценарий нескольких производителей, добавляющих задачи в очередь, и всякий раз, когда очередь не пустая, задачи должны выполняться с заранее определенной скоростью. (используя несколько потоков для поддержания скорости выполнения). После выполнения доступных задач исполнитель должен дождаться выполнения задач, доступных в очереди.Trigger SheduledExecutor с blockingQueue Java

Я знаю, что blockingQueue может использоваться для запуска части здесь и ScheduledExecutorService для выполнения задач с фиксированной скоростью. Но я не мог найти способ связать способность обоих из-за моей потребности. Поэтому я был бы очень благодарен, если бы вы могли дать мне какое-либо предложение сделать это.

+0

Что предопределенная скорость, при которой задачи должны быть выполнены, если очередь задач не пуста? Не хотите ли вы просто выполнить задачи, как только сможете? – rohitvats

ответ

0

Вам необходимо, чтобы очередь задач была доступна как потокам производителей, так и потребителей. Я написал основную программу, чтобы продемонстрировать это, но я дам вам играть с BlockingQueue API и ScheduledExecutor в соответствии с вашими потребностями:

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(); 
      } 
     } 
    } 
} 
Смежные вопросы