Java_生产者消费者模式

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package testdemo1;

import java.util.logging.Level;
import java.util.logging.Logger;

class Mantou {

    private int id;

    public Mantou(int val) {
        this.id = val;
    }

    public String toString() {
        return "Mantou id: " + this.id;
    }
}

class Basket {

    private Mantou[] mStack = new Mantou[6];
    private int index = 0;

    public synchronized void push(Mantou m) {
        while (index == mStack.length) {
            try {
                 this.wait();
                System.out.println("full........................!!!");
               
            } catch (InterruptedException ex) {
                Logger.getLogger(Basket.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        this.notify();
        
        mStack[index] = m;

        index++;

        System.out.println("add Mantou id= " + m + " and index= " + index);
       

    }

    public synchronized Mantou pop() {

        while (index == 0) {

            try {
                System.out.println("empty........................!!!");
                wait();
            } catch (InterruptedException ex) {
                Logger.getLogger(Basket.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        this.notify();
        index--;
        Mantou m = mStack[index];
        System.out.println("get Mantou id= " + m + " and index= " + index);

        
        return m;
    }
}

class Producer implements Runnable {

    private Basket brasket = new Basket();

    public Producer(Basket val) {
        this.brasket = val;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            Mantou m = new Mantou(i);
            brasket.push(m);

            try {
                //            Thread.sleep(Math);
                Thread.sleep((int) (Math.random() * 500));
            } catch (InterruptedException ex) {
                Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

}

class Consumer implements Runnable {

    private Basket brasket = new Basket();

    public Consumer(Basket val) {
        this.brasket = val;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            Mantou m = brasket.pop();
            try {
                Thread.sleep((int) (Math.random() * 1000));
            } catch (InterruptedException ex) {
                Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

public class TestDemo1 {

    public static void main(String[] args) {
        // TODO code application logic here
        Basket s = new Basket();
        Producer producer = new Producer(s);
        Consumer consumer = new Consumer(s);
        Thread tr1 = new Thread(producer);
        Thread tr2 = new Thread(consumer);
        tr1.start();
        tr2.start();
    }

}


原文地址:https://www.cnblogs.com/MarchThree/p/3720415.html