Java生产者消费者模式
生产者不断向队列中添加数据,消费者不断从队列中获取数据。
如果队列满了,则生产者不能添加数据;如果队列为空,则消费者不能获取数据。
通过实现了BlockingQueue接口的LinkedBlockingQueue来模拟同步。
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class test {
private static final int capacity = 5;
private static final int time = 1000;
public static void main(String[] args) {
BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<>(capacity);
Producer p1 = new Producer("p1", blockingQueue);
Producer p2 = new Producer("p2", blockingQueue);
Producer p3 = new Producer("p3", blockingQueue);
Consumer c1 = new Consumer("c1", blockingQueue);
Consumer c2 = new Consumer("c2", blockingQueue);
p1.start();
p2.start();
p3.start();
c1.start();
c2.start();
}
public static class Producer extends Thread {
private BlockingQueue<String> blockingQueue;
public Producer(String name, BlockingQueue<String> blockingQueue) {
super(name);
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
while (true) {
try {
this.blockingQueue.put(currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static class Consumer extends Thread {
private BlockingQueue<String> blockingQueue;
public Consumer(String name, BlockingQueue<String> blockingQueue) {
super(name);
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
while (true) {
String name = null;
try {
name = this.blockingQueue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name);
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
执行结果
p1
p2
p3
p2
p1
p3
浙公网安备 33010602011771号