美文网首页
阻塞队列的实现

阻塞队列的实现

作者: shengjk1 | 来源:发表于2020-11-18 11:43 被阅读0次

之前看到 ArrayBlockQueue 的实现,感觉挺有意思的,自己也实现一个阻塞队列,通过等待通知的方式,直接上代码

package thread;

import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author shengjk1
 * @date 2020/11/4
 */
// 实现一个阻塞队列
public class MyBlockQueue<T> {
    final private LinkedList<T> lists = new LinkedList<>();
    final private int MAX = 100;
    
    private Lock lock = new ReentrantLock();
    private Condition producer = lock.newCondition();
    private Condition consumer = lock.newCondition();
    
    public static void main(String[] args) {
        MyContainer<String> c = new MyContainer<>();
        //启动消费者线程
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 50; j++) {
                    System.out.println(c.get());
                }
                ;
            }, "c" + i).start();
        }
        
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

//      //启动生产者线程
        for (int i = 0; i < 2; i++) {
            new Thread(() -> {
                for (int j = 0; j < 250; j++) c.put(Thread.currentThread().getName() + " " + j);
            }, "p" + i).start();
        }
    }
    
    public void put(T t) {
        lock.lock();
        try {
            while (lists.size() == MAX) {
                producer.await();
            }
            lists.add(t);
            //通知所有消费者消费
            consumer.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    
    public T get() {
        T t = null;
        lock.lock();
        try {
            while (lists.size() == 0) {
                consumer.await();
            }
            t = lists.removeFirst();
            producer.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
        return t;
    }
}

相关文章

  • 并发编程之并发队列

    常见的并发队列有2种:阻塞队列和非阻塞队列。阻塞队列使用锁实现,非阻塞队列使用CAS非阻塞算法实现。这2种队列都是...

  • 并发队列-无界非阻塞队列ConcurrentLinkedQueu

    一、 前言 常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一...

  • 多线程之非阻塞队列

    ConcurrentLinkedQueue 相对于阻塞队列加锁实现阻塞,非阻塞队列采用无锁CAS的方式来实现。

  • 阻塞队列--ArrayBlockingQueue

    什么是阻塞队列----阻塞队列概述 ArrayBlockingQueue是一个用数组实现的有界阻塞队列,按先进先出...

  • 线程安全8 - 可阻塞的队列

    队列包含固定长度的队列和不固定长度的队列 什么是阻塞队列,阻塞队列的作用与实际应用,阻塞队列的实现原理 Array...

  • 9.阻塞队列和线程池

    阻塞队列 特性 队列是空的时候,从队列获取元素的操作会被阻塞 队列是满的时候,往队列添加元素的操作会被阻塞 实现 ...

  • 阻塞队列

    原理 当阻塞队列空时,从队列中读取元素操作被阻塞。当阻塞队列满时,从队列中写入元素操作被阻塞。 已经实现的类 Ar...

  • Java队列

    阻塞队列 ArrayBlockingQueue 一个用循环数组实现的有界阻塞队列。必须指定队列长度,按 FIFO(...

  • ArrayBlockingQueue源码解析

    在 Java8 中,提供了 7 个阻塞队列 ArrayBlockingQueue 数组实现的有界阻塞队列, 此队列...

  • Java集合--非阻塞队列(ConcurrentLinkedQu

    1.0 非阻塞队列 在上篇中,我们讲到了阻塞队列,以及阻塞队列中的几个实现类。 本篇,我们继续对队列进行研究。而今...

网友评论

      本文标题:阻塞队列的实现

      本文链接:https://www.haomeiwen.com/subject/wmxciktx.html