生产者消费者问题

wait-notify解决方法:


 

Buffer方法:对应的是进程的拿出和放入

import java.util.LinkedList;

import static java.lang.Thread.sleep;

public class Buffer {
    private final int MAX = 10;
    private LinkedList<Object> list = new LinkedList<>();

    /**
     *  @param value 生产产品的名字,是什么玩意
     * @param time 生产者生产花费的时间
     */
    public void product(int value, int time){
        synchronized (list){
            while(list.size() == MAX){
                System.out.println("仓库中已经放满"+MAX+"个仓品,达到上限,无法继续放入");
                try {
                    wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
                list.add(value);
                try {
                    sleep(time*1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                finally {
                    System.out.println("生产者生产花费了"+time+"秒");
                }
                System.out.println("生产者为:"+Thread.currentThread().getName()+"当前仓库容量为"+list.size());
                System.out.println("-------------------------------");
                list.notifyAll();

        }
    }

    /**
     * 相应的对应上面的生产者,基本代码没有任何区别
     * @param time
     */
    public void consumer(int time){
        synchronized (list){
            {
                while(list.size() == 0){
                    System.out.println("仓库中已空,请等待生产者生产");
                    try {
                        wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                    list.remove();
                    try {
                        sleep(time*1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    finally {
                        System.out.println("消费者消费花费了"+time+"秒");
                    }
                    System.out.println("消费者为:"+Thread.currentThread().getName()+"当前仓库容量为"+list.size());
                    System.out.println("-------------------------------");
                    list.notifyAll();

            }
        }
    }
}
Buffer

Producer方法:对应的是product方法的引用

public class Producer implements Runnable{
    private Buffer buffer;
    private String producter;

    public Producer(Buffer buffer){
        this.buffer = buffer;
    }

    public String getProducter() {
        return producter;
    }

    public void setProducter(String producter) {
        this.producter = producter;
    }

    @Override
    public void run() {
        buffer.product((int)(Math.random()*10),(int)(Math.random()*10));
    }

}
Producer

Comsumer:方法对应的是comsumer方法的引用

public class Consumer implements Runnable{
    private Buffer buffer;
    private String  consumer;
    public Consumer(Buffer buffer){
        this.buffer = buffer;
    }

    public String getConsumer() {
        return consumer;
    }

    public void setConsumer(String consumer) {
        this.consumer = consumer;
    }

    @Override
    public void run() {
        buffer.consumer((int)(Math.random()*10));
    }
}
Comsumer

Text:测试类

import java.lang.reflect.Field;

public class text {
    public static void main(String[] args) throws ClassNotFoundException {
        Buffer buffer = new Buffer();
        Thread producter1 = new Thread(new Producer(buffer));
        Thread producter2 = new Thread(new Producer(buffer));
        Thread producter3 = new Thread(new Producer(buffer));
        Thread producter4 = new Thread(new Producer(buffer));

        Thread comsumer1 = new Thread(new Consumer(buffer));
        Thread comsumer2 = new Thread(new Consumer(buffer));
        Thread comsumer3 = new Thread(new Consumer(buffer));
        Thread comsumer4 = new Thread(new Consumer(buffer));

        producter1.start();
        producter2.start();
        producter3.start();
        producter4.start();

        comsumer1.start();
        comsumer2.start();
        comsumer3.start();
        comsumer4.start();






//        people_Producer p = new people_Producer();
//        Class clazz = p.getClass();
//        Field[] fields = clazz.getDeclaredFields();
//        for (Field field :
//                fields) {
//
//        }

    }

}
Text

 

posted @ 2022-05-01 19:02  七色angel  阅读(20)  评论(0编辑  收藏  举报