A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 15579171087 中级黑马   /  2014-9-10 00:11  /  943 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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();
                }
        }
       
}






1 个回复

倒序浏览
多线程啊,正在学习中
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马