0

私は現在、キューにタスクを追加する複数のプロデューサのシナリオを持ち、キューが空でない場合は、事前定義された速度でタスクを実行する必要があります。 (実行速度を維持するために複数のスレッドを使用する)使用可能なタスクを実行した後、エグゼキュータはキュー内のタスクを再び使用できるまで待機する必要があります。triggering SheduledExecutor with 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(); 
      } 
     } 
    } 
}