黑马程序员技术交流社区

标题: 生产者消费者模型 [打印本页]

作者: 15579171087    时间: 2014-9-10 00:11
标题: 生产者消费者模型
package com.test;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//生产者消费模型
public class ProducerConsumerDemo {

        public static void main(String[] args) {
               
                Resource resource=new Resource();//资源对象
                Producer producer=new Producer(resource);//生产者对象
                Consumer consumer=new Consumer(resource);//消费者对象
               
                //使用4个线程,模拟2个生产者,2个消费者
                Thread t1=new Thread(consumer);
                Thread  t2=new Thread(producer);
                Thread t3=new Thread(consumer);
                Thread  t4=new Thread(producer);
               
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }

}


class Resource{
        private String name;
        private int count=1;
        private boolean flag=false;
        Lock lock=new ReentrantLock();
        Condition con=lock.newCondition();

        //生产出一个产品,并保证线程安全
        public void set(String name){
                lock.lock();//获取锁
               
                //flag用于标记是否有产品,如果有则进入等待状态,并唤醒其他线程
                try {
                        while(flag){
                                        con.await();
                        }
                        this.name=name+"---"+count++;
                        System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
                        flag=true;
                        con.signalAll();
                }catch (Exception e) {
                       
                }finally{
                        lock.unlock();//释放锁
                }
        }
       
        //消耗一个产品,并保证线程安全
        public void out(){
                lock.lock();
                while(!flag){
                        try {
                                        con.await();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                System.out.println(Thread.currentThread().getName()+"......消费者......"+this.name);
                flag=false;
                con.signalAll();
                lock.unlock();
        }
}

class Producer implements Runnable{
        private Resource resource;
       
        Producer(Resource resource){
                this.resource=resource;
        }

        public void run() {
                while(true){
                        resource.set("+商品+");
                }
        }
}

class Consumer implements Runnable{
       
        private Resource resource;
       
        Consumer(Resource resource){
                this.resource=resource;
        }

        public void run() {
                while(true){
                        resource.out();
                }
        }
       
}







作者: 1169646761    时间: 2014-9-10 00:28
多线程啊,正在学习中




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2