生产者与消费者模式是一种经典同步案例
下面我用代码来描述一下这个同步该如何实现
实现基于lock+Condition 模式
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//基于条件监听机制的生产者与消费者
public class CPTest2 {
public static void main(String[] args) {
//创建一个线程池
ExecutorService es=Executors.newFixedThreadPool(10);
//创建一个锁
final Lock lock=new ReentrantLock();
//创建一个仓库为空的条件
final Condition empty=lock.newCondition();
//创建一个仓库已满的条件
final Condition full=lock.newCondition();
//创建一个仓库
final List<Integer> list=new ArrayList<Integer>();
//开启5个消费者线程
for(int i=0;i<5;i++){
es.execute(new Runnable(){
@Override
public void run() {
while(!Thread.interrupted()){
lock.lock();
try{
//当仓库为空时,消费者线程等待
if(list.size()==0){
try {
System.out.println("仓库已空,等待生产者生产");
//等待生产者进行生产
full.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
//消费货物
list.remove(0);
System.out.println(Thread.currentThread().getId()+"消费了一个货物");
//通知所有等待的生产者线程
empty.signalAll();
}
}finally{
//释放对象
lock.unlock();
try {
//将cpu 调度权让给其他消费者线程
Thread.yield();
//消费线程睡眠0.1秒 ,生产者线程睡眠1秒,说明消费速度大于生产速度,会产生仓库已空提示
//Thread.sleep(100);
//消费者线程休眠1秒,生产者线程休眠0.1秒,说明生产速度大于消费速度,会产生仓库已满提示
Thread.sleep(1000);
//消费者与生产者休眠时间一样
// Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
}
//开启5个生产者线程
for(int i=0;i<5;i++){
es.execute(new Runnable(){
@Override
public void run() {
while(!Thread.interrupted()){
//获得该类对象锁
lock.lock();
try{
//仓库的容量为100
if(list.size()==100){
try {
System.out.println("仓库已满等待消费者消费");
//等待消费者消费
empty.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
//添加货物
list.add(23);
System.out.println(Thread.currentThread().getId()+"生产了一个货物");
//通知所有的消费者线程,进行消费
full.signalAll();
}
}finally{
//释放锁
lock.unlock();
try {
//将cpu 调度权让给其他生产者线程
Thread.yield();
//消费线程睡眠0.1秒 ,生产者线程睡眠1秒,说明消费速度大于生产速度,会产生仓库已空提示
//Thread.sleep(1000);
//消费者线程休眠1秒,生产者线程休眠0.1秒,说明生产速度大于消费速度,会产生仓库已满提示
Thread.sleep(100);
//消费者与生产者休眠时间一样
// Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
}
}
}
实现效果自己测试。
你可以调节仓库的容量
你可以调节消费者和生产者的数量
你可以调节消费者消费的时间和生产者生产的时间
代码自己改,应该挺简单的吧
博客写完了,有没有学会点东西了。