/**
 *
 *
 *   BlockingQueue 学习
 *   BlockingQueue 继承自Collection
 *   意思是 阻塞 和 队列
 *      阻塞就是等待的意思,当前线程就等待了,放不进去队列就阻塞,取不去来就阻塞
 *      队列的意思就是:先进先出啊。
 *   四组API的使用
 *
 *
 *
 */
public class Test {

    public static void main(String[] args) throws InterruptedException{
        Test test = new Test();
        test.test4();
    }

    /**
     *
     * 抛出异常的方式
     *
     */
    public void test1(){
        //队列的大小 只能放3个
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(3);

        System.out.println(blockingQueue.add("a"));
        System.out.println(blockingQueue.add("b"));
        System.out.println(blockingQueue.add("c"));

      //  java.lang.IllegalStateException: Queue full
      //  System.out.println(blockingQueue.add("d"));

        System.out.println("==================");


        System.out.println(blockingQueue.remove());

        //检测队首元素 这里抛出异常的时候测试的时候使用 这个方法
        System.out.println("目前队首的元素是"+blockingQueue.element());
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
        // java.util.NoSuchElementException
        //System.out.println(blockingQueue.remove());
    }

    /**
     *
     *  这里不抛出异常
     *
     */
    public void test2(){

        //队列的大小 只能放3个
       ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(3);

        System.out.println(arrayBlockingQueue.offer("a"));
        System.out.println(arrayBlockingQueue.offer("b"));
        //这里返回的是true
        System.out.println(arrayBlockingQueue.offer("c"));
        //这里返回的是false
        System.out.println(arrayBlockingQueue.offer("d"));


        System.out.println("=========================");
        System.out.println(arrayBlockingQueue.poll());
        //检测队首元素 这里不抛出异常的时候测试的时候使用 这个方法
        System.out.println("目前队首的元素是"+arrayBlockingQueue.peek());
        System.out.println(arrayBlockingQueue.poll());
        //这里返回的是 c
        System.out.println(arrayBlockingQueue.poll());
        //这里不抛出异常,直接返回的是null
        System.out.println(arrayBlockingQueue.poll());

    }

    //等待阻塞之一:一直阻塞
    public void test3() throws InterruptedException{
        //队列的大小 只能放3个
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(3);
        arrayBlockingQueue.put("a");  //没有返回值
        arrayBlockingQueue.put("b");
        arrayBlockingQueue.put("c");
       // arrayBlockingQueue.put("d");  //因为队列里面只能放3个元素,当前线程就一直阻塞在这里了
        System.out.println("队列中放完了");

        System.out.println("==================");

        arrayBlockingQueue.take();    //没有返回值
        arrayBlockingQueue.take();
        arrayBlockingQueue.take();
        arrayBlockingQueue.take();    //因为队列中只有三个元素,取第四个的时后取不到当前线程就一直阻塞在这里了
        System.out.println("从队列中取完了");


    }

    // 当前线程阻塞几秒
    public void test4() throws InterruptedException{
        //队列的大小 只能放3个
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(3);
        //放的时候最多等两秒 如果两秒没有放进去当前线程就推出
        arrayBlockingQueue.offer("a",2, TimeUnit.SECONDS);
        arrayBlockingQueue.offer("b",2, TimeUnit.SECONDS);
        arrayBlockingQueue.offer("c",2, TimeUnit.SECONDS);
       // arrayBlockingQueue.offer("d",2, TimeUnit.SECONDS);

        System.out.println("队列中放完了");

        System.out.println("=================================");

        arrayBlockingQueue.poll(2,TimeUnit.SECONDS);  //取的时候取等两秒,如果取不到当前线程就退出
        arrayBlockingQueue.poll(2,TimeUnit.SECONDS);
        arrayBlockingQueue.poll(2,TimeUnit.SECONDS);
        arrayBlockingQueue.poll(2,TimeUnit.SECONDS);
        System.out.println("队列中取完了");

    }

}