Home / Class/ BlockingMessageQueue Class — netty Architecture

BlockingMessageQueue Class — netty Architecture

Architecture documentation for the BlockingMessageQueue class in Recycler.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  97ffd903_aa9f_4bb1_fb52_3d8d31957095["BlockingMessageQueue"]
  92da7dba_a9f6_c802_c3c1_5a54e228e444["Recycler.java"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|defined in| 92da7dba_a9f6_c802_c3c1_5a54e228e444
  5eb06f14_17b7_4c00_13fc_67944070f068["BlockingMessageQueue()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| 5eb06f14_17b7_4c00_13fc_67944070f068
  60d28342_cd00_7665_0a39_f0dc7344b7ce["offer()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| 60d28342_cd00_7665_0a39_f0dc7344b7ce
  93a4024b_2dfa_6141_05a8_48652fa97707["T()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| 93a4024b_2dfa_6141_05a8_48652fa97707
  488a82ea_db5d_5e9e_da1b_a8fbb2279f0a["size()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| 488a82ea_db5d_5e9e_da1b_a8fbb2279f0a
  36b84b1e_6937_1813_06f0_95d540834c5f["clear()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| 36b84b1e_6937_1813_06f0_95d540834c5f
  b0953fef_6e93_b5b9_d38b_266e5c1d5e3e["isEmpty()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| b0953fef_6e93_b5b9_d38b_266e5c1d5e3e
  2336a9c5_b74c_39a9_7164_00cae2b03547["capacity()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| 2336a9c5_b74c_39a9_7164_00cae2b03547
  77b5d948_e88e_4b7a_2631_d9a53d4ddbba["relaxedOffer()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| 77b5d948_e88e_4b7a_2631_d9a53d4ddbba
  61df7570_a6e3_8a6e_f34b_b337c0db1999["drain()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| 61df7570_a6e3_8a6e_f34b_b337c0db1999
  1bae6161_fa26_081d_9366_0a483c4ec194["fill()"]
  97ffd903_aa9f_4bb1_fb52_3d8d31957095 -->|method| 1bae6161_fa26_081d_9366_0a483c4ec194

Relationship Graph

Source Code

common/src/main/java/io/netty/util/Recycler.java lines 623–728

    private static final class BlockingMessageQueue<T> implements MessagePassingQueue<T> {
        private final Queue<T> deque;
        private final int maxCapacity;

        BlockingMessageQueue(int maxCapacity) {
            this.maxCapacity = maxCapacity;
            // This message passing queue is backed by an ArrayDeque instance,
            // made thread-safe by synchronising on `this` BlockingMessageQueue instance.
            // Why ArrayDeque?
            // We use ArrayDeque instead of LinkedList or LinkedBlockingQueue because it's more space efficient.
            // We use ArrayDeque instead of ArrayList because we need the queue APIs.
            // We use ArrayDeque instead of ConcurrentLinkedQueue because CLQ is unbounded and has O(n) size().
            // We use ArrayDeque instead of ArrayBlockingQueue because ABQ allocates its max capacity up-front,
            // and these queues will usually have large capacities, in potentially great numbers (one per thread),
            // but often only have comparatively few items in them.
            deque = new ArrayDeque<T>();
        }

        @Override
        public synchronized boolean offer(T e) {
            if (deque.size() == maxCapacity) {
                return false;
            }
            return deque.offer(e);
        }

        @Override
        public synchronized T poll() {
            return deque.poll();
        }

        @Override
        public synchronized T peek() {
            return deque.peek();
        }

        @Override
        public synchronized int size() {
            return deque.size();
        }

        @Override
        public synchronized void clear() {
            deque.clear();
        }

        @Override
        public synchronized boolean isEmpty() {
            return deque.isEmpty();
        }

        @Override
        public int capacity() {
            return maxCapacity;
        }

        @Override
        public boolean relaxedOffer(T e) {
            return offer(e);
        }

        @Override
        public T relaxedPoll() {
            return poll();
        }

        @Override
        public T relaxedPeek() {
            return peek();
        }

        @Override
        public int drain(Consumer<T> c, int limit) {
            T obj;
            int i = 0;
            for (; i < limit && (obj = poll()) != null; i++) {
                c.accept(obj);
            }
            return i;
        }

Frequently Asked Questions

What is the BlockingMessageQueue class?
BlockingMessageQueue is a class in the netty codebase, defined in common/src/main/java/io/netty/util/Recycler.java.
Where is BlockingMessageQueue defined?
BlockingMessageQueue is defined in common/src/main/java/io/netty/util/Recycler.java at line 623.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free