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

public class ProdusenKonsumenAntrian {
    public static void main(String[] args) throws InterruptedException {
        // Kapasitas 2 sengaja lebih kecil dari jumlah item (4)
        // agar put() benar-benar pernah menunggu slot kosong.
        BlockingQueue<Integer> antrian = new ArrayBlockingQueue<>(2);

        Thread produsen = new Thread(() -> {
            try {
                for (int i = 1; i <= 4; i++) {
                    antrian.put(i); // menunggu bila antrian penuh
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }, "produsen");

        int[] hasil = new int[4]; // dikumpulkan per indeks, dicetak setelah join
        Thread konsumen = new Thread(() -> {
            try {
                for (int i = 0; i < hasil.length; i++) {
                    hasil[i] = antrian.take(); // menunggu bila antrian kosong
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }, "konsumen");

        produsen.start();
        konsumen.start();
        produsen.join();
        konsumen.join();

        System.out.println("urutan item yang diterima konsumen:");
        for (int i = 0; i < hasil.length; i++) {
            System.out.println("  item ke-" + (i + 1) + ": " + hasil[i]);
        }
        System.out.println("sisa item di antrian: " + antrian.size());
    }
}
