lyl890

导航

阻塞队列

package com.collection;

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

/**
 * 用”等待队列“模拟唐僧师徒过通天河。
 */
public class TestBlockingQueue2 {
    static int CAPACITY = 3;
    static String[] westGroup = {"唐僧", "猪悟能", "沙悟净", "孙悟空"};


    public static void main(String[] args) throws Exception {
        test4();
    }

    /**
     * 第一组API:抛出异常
     */
    public static void test1() {
// 创建一只千年老龟容量3.
        BlockingQueue<String> 千年老龟 = new ArrayBlockingQueue<String>(CAPACITY);
        // 准备过河:唐僧,猪悟能,沙悟净 先上
        for (int i = 0; i < 3; i++) {
            boolean bool = 千年老龟.add(westGroup[i]);
            if (bool) {
                System.out.println(westGroup[i] + "上船成功!");
            }
        }
// 满了再添加就报异常:java.lang.IllegalStateException: Queue full
        boolean bool = 千年老龟.add("孙悟空");
        if (bool) {
            System.out.println("孙悟空上船成功!");
        } else {
            System.out.println("孙悟空上船失败!");
        }
        System.out.println("船头第一人是:" + 千年老龟.element());
        System.out.println("船上一共有:" + 千年老龟.size());
// 过完河都“下船”
        for (int i = 0; i < CAPACITY; i++) {
            String p = 千年老龟.remove();
            System.out.println("下船:" + p);
        }
// 都“下船”了,再remove(),也会异常。
// 千年老龟.remove(); // java.util.NoSuchElementException
    }

    /**
     * 第2组API:返回true或false
     */
    public static void test2() {
// 创建一只千年老龟容量3.
        BlockingQueue<String> 千年老龟 = new ArrayBlockingQueue<String>(CAPACITY);
// 准备过河:唐僧,猪悟能,沙悟净 先上
        for (int i = 0; i < 3; i++) {
            boolean bool = 千年老龟.offer(westGroup[i]);
            if (bool) {
                System.out.println(westGroup[i] + "上船成功!");
            }
        }
// 满了再添加也不抛异常:
        boolean bool = 千年老龟.offer("孙悟空");
        if (bool) {
            System.out.println("孙悟空上船成功!");
        } else {
            System.out.println("孙悟空上船失败!");
        }
        System.out.println("船头第一人是:" + 千年老龟.peek());
        System.out.println("船上一共有:" + 千年老龟.size());
// 过完河都“下船”
        for (int i = 0; i < CAPACITY; i++) {
            String p = 千年老龟.poll();
            System.out.println("下船:" + p);
        }
// 都“下船”了,再poll(),也不抛异常
        千年老龟.poll();
    }

    /**
     * 第3组API:常存抱柱信
     *
     * @throws Exception
     */
    public static void test3() throws Exception {
// 创建一只千年老龟容量3.
        BlockingQueue<String> 千年老龟 = new ArrayBlockingQueue<String>(CAPACITY);
// 准备过河:唐僧,猪悟能,沙悟净 先上
        for (int i = 0; i < 3; i++) {
            千年老龟.put(westGroup[i]); // 无返回值。
            System.out.println(westGroup[i] + "上船成功!");
        }
// 满了再添加:会一直阻塞。
        new Thread(){
            public  void run(){

                //下船
                try {
                    Thread.sleep(5000);
                    String p = 千年老龟.take();
                    System.out.println("线程中下船:" + p);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        System.out.println("孙悟空上船。。");

       千年老龟.put("孙悟空"); //如果调用put方法,队列满了,会一直等待,除非队列中取出了数据


        System.out.println("船头第一人是:" + 千年老龟.peek());
        System.out.println("船上一共有:" + 千年老龟.size());
// 过完河都“下船”
        for (int i = 0; i < CAPACITY; i++) {
            String p = 千年老龟.take();
            System.out.println("下船:" + p);
        }
// 都“下船”了,再take(),也会一直阻塞。
// 千年老龟.take();
    }

    /**
     * 第4组API:限时等待。
     *
     * @throws Exception
     */
    public static void test4() throws Exception {
// 创建一只千年老龟容量3.
        BlockingQueue<String> 千年老龟 = new ArrayBlockingQueue<String>(CAPACITY);
// 准备过河:唐僧,猪悟能,沙悟净 先上
        for (int i = 0; i < 3; i++) {
            千年老龟.offer(westGroup[i]); // 无返回值。
            System.out.println(westGroup[i] + "上船成功!");
        }
       // 满了再添加:再等待3秒钟,就退出
        boolean flag =  千年老龟.offer("孙悟空", 10, TimeUnit.SECONDS);
        System.out.println("孙悟空上船的结果为:"+flag);
        System.out.println("船头第一人是:" + 千年老龟.peek());
        System.out.println("船上一共有:" + 千年老龟.size());
         // 过完河都“下船”
        for (int i = 0; i < CAPACITY; i++) {
            String p = 千年老龟.take();
            System.out.println("下船:" + p);
        }
// 都“下船”了,再poll(),等待3秒,就退出
        千年老龟.poll(3, TimeUnit.SECONDS);
    }
}

  

posted on 2022-07-12 14:35  静静书中仙  阅读(10)  评论(0编辑  收藏  举报