Saturday, August 29, 2015

Producer Consumer 生产者/消费者问题



生产者/消费者问题_2
class Storage2{
    private final int MAX_SIZE = 100;
    private List<Object> list = new LinkedList<Object>();
     
    private Lock lock = new ReentrantLock();
    private Condition full = lock.newCondition();
    private Condition empty = lock.newCondition();
     
    public void produce(int num){
        lock.lock();
         
        while(list.size() + num > MAX_SIZE){
            System.out.println("线程:" + Thread.currentThread().getId() + " --> "
                    "需要生产的产品:" + num + ",库存:" + list.size() + "暂时无法执行生产任务.");
            try {
                full.await();
            catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
         
        for(int i=0; i<num; i++){
            list.add(new Object());
        }
        System.out.println("线程:" + Thread.currentThread().getId() + " --> "
                "已生产产品数:" + num + ",库存:" + list.size());
        full.signalAll();
        empty.signalAll();
        lock.unlock();
    }
     
    public void consume(int num){
        lock.lock();
        while(list.size() < num){
            System.out.println("线程:" + Thread.currentThread().getId() + " --> "
                    "需要消费产品:" + num + ",库存:" + list.size() + "暂时无法提供消费服务.");
            try {
                empty.await();
            catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        for(int i=0; i<num; i++)
            list.remove(0);
        System.out.println("线程:" + Thread.currentThread().getId() + " --> "
                "消费:" + num + ",库存:" + list.size());
        empty.signalAll();
        full.signalAll();
        lock.unlock();
    }
    public List<Object> getList() {
        return list;
    }
    public void setList(List<Object> list) {
        this.list = list;
    }
    public int getMAX_SIZE() {
        return MAX_SIZE;
    }
}
class Producer2 extends Thread{
    private int num;
    private Storage2 storage;
    public Producer2(Storage2 storage) {
        super();
        this.storage = storage;
    }
     
     
     
    @Override
    public void run() {
        // TODO Auto-generated method stub
        produce(num);
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
     
    public void produce(int sum){
        this.storage.produce(sum);
    }
}
class Consumer2 extends Thread{
    private int num;
    private Storage2 storage;
    public Consumer2(Storage2 storage) {
        super();
        this.storage = storage;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
     
    public void consumer(int sum){
        this.storage.consume(sum);
    }
     
    @Override
    public void run() {
        // TODO Auto-generated method stub
        consumer(num);
    }
}
public class ProducerConsumerMode_2 {
    public static void main(String[] args){
        Storage2 storage = new Storage2();
        Producer2[] p = new Producer2[10];
        Consumer2[] s = new Consumer2[10];
        for(int i=0; i<10; i++){
            int num;
            num = (int) (Math.random()*30);
            p[i] = new Producer2(storage);
            p[i].setNum(num);
            num = (int) (Math.random()*30);
            s[i] = new Consumer2(storage);
            s[i].setNum(num);
        }
        for(int i=0; i<10; i++){
            p[i].start();
            s[i].start();
        }
    }


Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts