您的位置:首页 > 编程语言 > Java开发

生产者-消费者问题(condition)Java实现

2009-01-08 18:31 495 查看
package book.j2se5;

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 ConditionTest {

public static class Basket{
Lock lock=new ReentrantLock();//锁
//根据锁产生Condition对象
Condition produced=lock.newCondition();
Condition consumed=lock.newCondition();
int num=0;//篮子中的苹果数,最多为1
/**生产苹果,往篮子里面放*/
public void produce()throws InterruptedException{
lock.lock();//获得锁
System.out.println("Producer get a lock......");
try{
//判断是否满足生产条件
while(num==1){
//如果有苹果,则不生产,放弃锁,进入睡眠
//等待消费者消费
System.out.println("Producer sleep......");
consumed.await();
System.out.println("Producer awaked.....");
}
//生产苹果
Thread.sleep(500);
System.out.println("Producer produced an Apple.");
num=1;
//通知等待produced Condition的线程
produced.signal();
}finally{
lock.unlock();
}
}
public void consume()throws InterruptedException{
lock.lock();
System.out.println("Consumer get a lock.......");
try{
//判断是否满足消费条件
//等待生产者生产苹果
while(num==0){
System.out.println("Consumer sleep.........");
produced.await();
System.out.println("Consumer awaked........");
}
//吃苹果
Thread.sleep(500);
System.out.println("Consumer consumed an Apple.");
num=0;
//发信号唤醒某个等待consumed Condition的线程
consumed.signal();
}finally{
lock.unlock();
}
}
}
/**测试Basket程序*/
public static void testBasket()throws Exception{
final Basket basket=new Basket();
//定义一个producer
Runnable producer=new Runnable(){
public void run(){
try{
basket.produce();
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
};
//定义一个consumer
Runnable consumer=new Runnable(){
public void run(){
try{
basket.consume();
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
};
//各生产3各consumer和producer
ExecutorService service=Executors.newCachedThreadPool();
for(int i=0;i<3;i++){
service.submit(producer);
}
for(int i=0;i<3;i++){
service.submit(consumer);
}
service.shutdown();
}
public static void main(String args[])throws Exception{
ConditionTest.testBasket();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: