生产者消费者模型

2021-12-27  本文已影响0人  圣明

基于Synchronized实现

package com.wan.situ;

import java.util.ArrayList;

public class ThreadTest {

    public int maxSize;
    public final ArrayList<String> products = new ArrayList<>();
    public Worker worker;
    public Consumer consumer;
    public boolean isRun = false;
    private static int index;

    public synchronized String getNewIndex() {
        return (index++) + "";
    }

    public ThreadTest(int size) {
        this.maxSize = size;
        this.worker = new Worker();
        this.consumer = new Consumer();
    }


    public void start() {
        this.isRun = true;
        this.consumer.start();
        this.worker.start();
    }

    class Worker extends Thread {
        @Override
        public void run() {
            while (isRun) {
                synchronized (products) {
                    if (products.size() < maxSize) {
                        try {
                            Thread.sleep(1000);
                            String p = getNewIndex();
                            products.add(p);
                            System.out.println("生产者 + " + p);
                            products.notify();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else {
                        try {
                            System.out.println("生产者 - wait");
                            products.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    class Consumer extends Thread {
        @Override
        public void run() {
            while (isRun) {
                synchronized (products) {
                    if (products.size() > 0) {
                        try {
                            Thread.sleep(1000);
                            System.out.println("消费者 - " + products.remove(0));
                            products.notify();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else {
                        try {
                            System.out.println("消费者 - wait");
                            products.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        new ThreadTest(10).start();
    }
}

消费者 - wait
生产者 + 0
生产者 + 1
生产者 + 2
生产者 + 3
生产者 + 4
生产者 + 5
生产者 + 6
生产者 + 7
生产者 + 8
生产者 + 9
生产者 - wait
消费者 - 0
消费者 - 1
消费者 - 2
消费者 - 3
消费者 - 4
消费者 - 5
消费者 - 6
消费者 - 7
上一篇下一篇

猜你喜欢

热点阅读