package atomic;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

public class AtomicExample05 {
    public static void main(String[] args) throws InterruptedException {
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(8);

        // 阻塞添加
        queue.add("1");
        queue.add("2");
        queue.add("3");
        System.out.println(queue);

        // 非阻塞添加
        queue.put("4");
        queue.put("5");
        System.out.println(queue);

        // 阻塞添加，但队列满不会进入阻塞
        queue.offer("6");
        queue.offer("7");
        System.out.println(queue);

        // 指定时间内进入阻塞
        queue.offer("8", 3, TimeUnit.SECONDS);
        queue.offer("9", 3, TimeUnit.SECONDS);// 8个队列满，不会进入阻塞
        System.out.println(queue);

        // 从头部获取数据并移出，如果队列为空进入阻塞直到有数据添加
        String take = queue.take();
        System.out.println(take);

        // 获取数据并移出队列第一个元素，如果队列为空将会阻塞指定的时间，直到在此期间有新数据写入，或者当前线程被其他线程中断，当线程超时会返回null
        String poll = queue.poll(3, TimeUnit.SECONDS);
        System.out.println(poll);

        // 从头部获取数据并移出，如果队列为空不会阻塞
        String poll1 = queue.poll();
        System.out.println(poll1);

        // 从头部获取数据不会移除，队列为空不会阻塞直接返回null
        String peek = queue.peek();
        System.out.println(peek);
    }
}
