前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程 - 生产者消费者模式

多线程 - 生产者消费者模式

作者头像
承苏凯
发布2020-07-24 10:06:19
4170
发布2020-07-24 10:06:19
举报
文章被收录于专栏:唯手熟尔唯手熟尔

生产者消费者模式

生产消费对象

代码语言:javascript
复制
package com.sukai.concurrency.test;

import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class factory<E> {
    private Queue<E> queue;
    private int maxSize;
    private ReentrantLock lock = new ReentrantLock();
    private Condition notfull = lock.newCondition();
    private Condition notemtry = lock.newCondition();

    // 构造函数
    public factory(Queue<E> queue, int maxSize) {
        this.queue = queue;
        this.maxSize = maxSize;
    }

    // 生产
    public void put(E e) throws InterruptedException {
        lock.lock();
        try {
            while (queue.size() == maxSize) {
                notemtry.await();
            }
            queue.add(e);
            System.out.println("新增一个元素");
            notfull.signal();
        } finally {
            lock.unlock();
        }
    }

    // 消费
    public void take() throws InterruptedException {
        lock.lock();
        try {
            while (queue.size() == 0) {
                notfull.await();
            }
            queue.remove();
            System.out.println("删除一个元素");
            notemtry.signal();
        } finally {
            lock.unlock();
        }
    }
}

创建线程

代码语言:javascript
复制
package com.sukai.concurrency.test;

import java.util.LinkedList;
import java.util.Queue;

public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        factory<Integer> factory = new factory<>(queue, 5);
        consumer<Integer> consumer = new consumer<>(factory, 233);
        productor<Integer> productor = new productor<>(factory);
        new Thread(consumer).start();
        new Thread(productor).start();
    }

}

class consumer<E> implements Runnable {
    private factory<E> factory;
    private E e;

    public consumer(factory<E> factory, E e) {
        this.factory = factory;
        this.e = e;
    }

    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                factory.put(e);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class productor<E> implements Runnable {
    private factory<E> factory;

    public productor(factory<E> factory) {
        this.factory = factory;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                factory.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

结果

image-20200718202614421
image-20200718202614421
image-20200718202629057
image-20200718202629057

结论

通过生产者消费者模式的编写,可以了解线程间的通信问题,通过condition的signal和await进行唤醒和等待比wait和notify更好,因为signal和await可以针对特定的线程进行唤醒和等待,比notifyAll更安全。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 生产者消费者模式
    • 生产消费对象
      • 创建线程
        • 结果
        • 结论
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档