BlockingQueue

BlockingQueue is like channel in go.

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

public class Main {
    public static void main(String[] args) {
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3);

        // producer
        new Thread(() -> {
            try {
                for (int i = 1; i <= 6; i++) {
                    queue.put(i);
                    System.out.println("< queued: " + i);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();

        // consumer
        new Thread(() -> {
            try {
                while (true) {
                    Integer item = queue.take();
                    Thread.sleep(500);
                    System.out.println("> consumed: " + item);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }
}

Expected output:

< queued: 1
< queued: 2
< queued: 3
< queued: 4
> consumed: 1
< queued: 5
> consumed: 2
< queued: 6
> consumed: 3
> consumed: 4
> consumed: 5
> consumed: 6