写出生产者消费者模式.用阻塞队列和不用的情况.
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author: small_double
* @Date: 2019/9/24 下午4:43
* 生产者消费着问题 2个生产者 10 个消费者
*/
public class ProducerConsumer<T> {
final private LinkedList<T> lists = new LinkedList<T>();
private int MAX = 10;
private Lock lock = new ReentrantLock();
private Condition producer = lock.newCondition();
private Condition consumer = lock.newCondition();
public T consume() {
T t = null;
try {
lock.lock();
while (lists.size() == 0) {
consumer.await();
}
t = lists.removeFirst();
producer.signalAll();
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally {
lock.unlock();
}
return t;
}
public void produce(T t) {
try {
lock.lock();
while (lists.size() == MAX) {
producer.await();
}
lists.add(t);
consumer.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public static void main(String[] args) {
ProducerConsumer<String > producerConsumer = new ProducerConsumer();
for (int i = 0; i < 100; i++) {
new Thread(()->{
for (int j = 0; j < 5; j++) {
System.out.println(producerConsumer.consume());
}
},"c"+i).start();
}
for (int i = 0; i < 2; i++) {
// jdk8 新特性 函数式编程。
new Thread(()->{
for (int j = 0; j < 25; j++) {
producerConsumer.produce(Thread.currentThread().getName()+j);
}
},"p"+i).start();
}
}
}
Last updated
Was this helpful?