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

java多线程之生产者和消费者模型

2016-01-07 10:32 483 查看
生产者和消费者模型

public class Model {

public static void main(String[] args) {
Resource r = new Resource();
Producer p1 = new Producer(r);
Producer p2 = new Producer(r);
Producer p3 = new Producer(r);
Consumer c1 = new Consumer(r);
Consumer c2 = new Consumer(r);
Consumer c3 = new Consumer(r);
new Thread(p1).start();
new Thread(p2).start();
new Thread(p3).start();
new Thread(c1).start();
new Thread(c2).start();
new Thread(c3).start();

}
}

/**
* 实现内存共享
* 加锁的前提条件:
*    1。有共享数据
*    2。有多条指令对共有数据进行操作
* 同步:
*    有多个线程对共享数据操作
* @author admin
*
*/

class Resource {
private int count = 1;
private String name;
private boolean flag = true;
private Lock lock = new ReentrantLock();  //建立互斥所
// private Condition con = lock.newCondition();  //获得监视器
private Condition producer_con = lock.newCondition();
private Condition consumer_con = lock.newCondition();

//生产鸭子
public  void produce(String name) {
lock.lock();
try{
while(flag){  //有鸭子,需要消费,生产线程等待,唤醒消费线程
try {
producer_con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//没有鸭子,进行生产
count++;
this.name = name;
System.out.println(Thread.currentThread().getName()+this.name+",数量为:"+count);
flag = true;  //表示生产出鸭子
consumer_con.signal();
}
//解锁
finally
{
lock.unlock();
}
}
//消费鸭子
public  void consume(String name) {
lock.lock();
try{
while(!flag){  //没有鸭子了,需要生产了
try {
consumer_con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//有鸭子,进行消费
this.name = name;
System.out.println(Thread.currentThread().getName()+this.name+",数量为:"+count);
flag = false;  //表示鸭子已经消费了
producer_con.signal();
}
finally{
lock.unlock();
}
}
}

class Producer implements Runnable {
// 共享资源
private Resource resource;

// 初始化资源
public Producer(Resource resource) {
this.resource = resource;
}

// 实现生产者的调用
@Override
public void run() {
while (true) {
resource.produce("生产鸭子");
}
}

}

class Consumer implements Runnable {
// 共享资源
private Resource resource;

// 初始化资源
public Consumer(Resource resource) {
this.resource = resource;
}

// 实现生产者的调用
@Override
public void run() {
while (true) {
resource.consume("消费鸭子");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: