生产者与消费者,关键在于一把锁,两个条件
import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Condtion_value<T> {
private LinkedList<T> lists=new LinkedList<>();
private int MAX=10; //最多10个
private int count=0;
private Lock lock=new ReentrantLock();
private Condition producer=lock.newCondition(); //条件
private Condition comsumer=lock.newCondition();
/*
* 生产
*/
public void put(T t){
try {
lock.lock(); //加锁
while(lists.size()==MAX){
producer.await(); //只生产者阻塞
}
lists.add(t);
System.out.println("生产--"+t);
++count;
comsumer.signalAll(); //只叫醒消费者,通知消费者进行消费
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
/*
* 消费
*/
public T get(){
T t=null;
try {
lock.lock();
while(lists.size()==0){
comsumer.await();
}
t=lists.removeFirst();
count++;
producer.signalAll(); //只通知生产者生产
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
return t;
}
public static void main(String[] args) {
final Condtion_value<String> cv=new Condtion_value<>();
//启动消费者
for(int i=0;i<10;i++){
new Thread(new Runnable() {
public void run() {
while(true) System.out.println("消费--"+cv.get());
}
},"c"+i).start();
}
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
//启动生产者
for(int i=0;i<2;i++){
new Thread(new Runnable() {
public void run() {
while(true) cv.put(Thread.currentThread().getName());
}
},"p"+i).start();
}
}
}
mark:学习笔记