タスクキューは、プロデューサスレッドとコンシューマスレッドの両方からアクセスできる必要があります。私はこれを実証するための基本的なプログラムを書いたが、私はあなたが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();
}
}
}
}
タスクキューは空ではありませんか?できるだけ早くタスクを実行したいだけではありませんか? – rohitvats