WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Java Collections · Guru · question 87 of 100

What is the difference between a BlockingQueue and a TransferQueue in Java Collections, and how can you use them for messaging and coordination?

📕 Buy this interview preparation book: 100 Java Collections questions & answers — PDF + EPUB for $5

In Java Collections, both BlockingQueue and TransferQueue are interfaces that define collections for handling messaging and coordination between threads.

BlockingQueue interface provides a queue for producers and consumers to pass data between each other, where a producer can add elements to the queue and a consumer can remove elements from it. However, if the queue is full, the producer will block until there is an available space in the queue, and if the queue is empty, the consumer will block until there are elements to be consumed. This makes it an efficient and thread-safe way to implement a producer-consumer pattern.

Here is an example code for creating a BlockingQueue and performing basic operations on it:

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;

public class BlockingQueueExample {
    public static void main(String[] args) {
        // Create a blocking queue with a capacity of 10
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);

        // Add elements to the queue
        queue.add("One");
        queue.add("Two");
        queue.add("Three");

        // Remove elements from the queue
        String element1 = queue.remove();
        String element2 = queue.remove();

        System.out.println("Elements removed: " + element1 + ", " + element2);
    }
}

On the other hand, TransferQueue interface extends BlockingQueue and adds a transfer operation that allows a producer to transfer an element to a consumer immediately. If there is no waiting consumer, the transfer operation blocks until there is a consumer available. If the queue is full, the transfer operation blocks until there is an available space in the queue. This makes TransferQueue more suitable for scenarios where real-time messaging and coordination is required.

Here is an example code for creating a TransferQueue and performing a transfer operation on it:

import java.util.concurrent.TransferQueue;
import java.util.concurrent.LinkedTransferQueue;

public class TransferQueueExample {
    public static void main(String[] args) throws InterruptedException {
        // Create a transfer queue
        TransferQueue<String> queue = new LinkedTransferQueue<>();

        // Create a consumer thread
        Thread consumer = new Thread(() -> {
            try {
                // Wait for an element to be transferred
                String element = queue.take();
                System.out.println("Element transferred: " + element);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // Start the consumer thread
        consumer.start();

        // Transfer an element to the consumer thread
        queue.transfer("Hello, World!");
    }
}

In summary, while both BlockingQueue and TransferQueue are used for messaging and coordination between threads, TransferQueue provides a more efficient and real-time way of transferring elements between threads.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Java Collections interview — then scores it.
📞 Practice Java Collections — free 15 min
📕 Buy this interview preparation book: 100 Java Collections questions & answers — PDF + EPUB for $5

All 100 Java Collections questions · All topics