java实现生产者消费者模式(基于wait、notify)

示例代码

package test;

import java.io.IOException;
import java.util.*;

/**
 * @Description TODO
 * @Author linmingxing
 * @Date 2020/3/5 下午11:52
 **/
public class Test {


    public static void main(String[] args) throws IOException, InterruptedException {

        List list = new ArrayList();
        Producer producer = new Producer(list);
        Consumer consumer = new Consumer(list);
        new Thread(producer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();
        new Thread(consumer).start();

    }
}


class Producer implements Runnable {

    List list;

    public Producer(List list) {
        this.list = list;
    }

    @Override
    public void run() {
        while (true){
            synchronized (list) {
                while (list.size() == 3) {
                    //等待消费者消费
                    try {
                        list.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //即将生产出来的元素
                int prod = list.size() + 1;
                //生产元素
                list.add(prod);
                System.out.println("生产出===>" + prod);
                //因为之前列表中的元素为空,所以消费者线程正在等待,所以需要手动唤醒消费者线程
                list.notify();
            }
            try {
                //让出当前线程的执行权,是线程处于就绪状态
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Consumer implements Runnable {

    List list;

    public Consumer(List list) {
        this.list = list;
    }

    @Override
    public void run() {
        while (true){
            synchronized (list) {
                while (list.size() == 0) {
                    //暂时没有元素可消费,使线程等待
                    try {
                        list.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("消费掉===>" + list.remove(0));
                //唤醒正在等待的生产者线程
                list.notify();
            }
            try {
                //让出当前线程的执行权,是线程处于就绪状态
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章