0

我目前正在研究有多個生產者將任務添加到隊列,並且每當隊列不爲空的情況下的Java應用程序應該以預定義的速率執行任務。 (使用多個線程來維持執行速率)執行完可用任務後,執行程序必須等待隊列中的任務再次可用。觸發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(); 
      } 
     } 
    } 
}