生产者和消费者模型
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("消费鸭子");
}
}
}