队列之四组API简单使用

第一组 —> 抛出异常:


/**
 * 抛出异常
 * 添加移除的操作 超出queue构造参数的数量 则会抛出异常
 * 如:
 * ArrayBlockingQueue<>(3) 数量为3
 * 1、queue.add("a") 添加超过数量     java.lang.IllegalStateException
 * 2、queue.remove() 移出超过数量     java.util.NoSuchElementException
 * 3、检测队首找不到                  java.util.NoSuchElementException
 *
 * 添加       add()
 * 移除       remove()
 * 检测队首    element()
 */

ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);
//添加
System.out.println(queue.add("a"));
System.out.println(queue.add("b"));
System.out.println(queue.add("c"));
System.out.println("=====================================");
//移除
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println("=====================================");
//检测队首
System.out.println(queue.element());

第二组 —> 有返回值不抛出异常:


/**
 * 有返回值不抛出异常
 * 添加移除超过数量 只会返回 true 或者 false
 * 检测队首 检测不到会返回null
 *
 * 添加       offer()
 * 移除       poll()
 * 检测队首    peek()
 */

ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);
//添加
System.out.println(queue.offer("a"));
System.out.println(queue.offer("b"));
System.out.println(queue.offer("c"));
System.out.println("=====================================");
//移除
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println("=====================================");
//检测队首
System.out.println(queue.peek());

第三组 —> 阻塞等待:


/**
 * 阻塞 等待
 * 添加移除超过数量 会进入阻塞状态  (像死循环)
 * 没有检测队首
 *
 * 添加       put()
 * 移除       take()
 */

ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);
queue.put("a");
queue.put("b");
queue.put("c");
System.out.println("=====================================");
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println("=====================================");

第四组 —> 超时等待:


/**
 * 超时等待
 * 添加移除命令 如果超过指定的时间参数
 * 则不再等待(就是给添加一个时间,这个时间如果不成功则不再等待)
 * 
 * 添加       offer(,,)
 * 移除       poll(,)
 */

ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);
System.out.println(queue.offer("a", 3, TimeUnit.SECONDS));
System.out.println(queue.offer("b", 3, TimeUnit.SECONDS));
System.out.println(queue.offer("c", 3, TimeUnit.SECONDS));
System.out.println("=====================================");
System.out.println(queue.poll(3, TimeUnit.SECONDS));
System.out.println(queue.poll(3, TimeUnit.SECONDS));
System.out.println(queue.poll(3, TimeUnit.SECONDS));
System.out.println(queue.poll(3, TimeUnit.SECONDS));
System.out.println("=====================================");

补充 同步队列:


/**
 * 同步队列     没有数量限制
 * 如果添加一条数据,就必须等待这条数据取出,如果没有取出则会一直等待
 * 如:
 *    queue.put("1");
 *    上面put(添加)了一条数据,则必须等待这条数据被获取
 *    如果没有 queue.take() ,则进入等待状态;
 */

SynchronousQueue<String> queue = new SynchronousQueue<>();
new Thread(() -> {
    try {
        System.out.println(Thread.currentThread().getName() + "<=>" + "put 1");
        queue.put("1");
        System.out.println(Thread.currentThread().getName() + "<=>" + "put 2");
        queue.put("2");
        System.out.println(Thread.currentThread().getName() + "<=>" + "put 3");
        queue.put("3");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}, "T1").start();
new Thread(() -> {
    try {
        TimeUnit.SECONDS.sleep(3);
        System.out.println(Thread.currentThread().getName() + "<=>" + queue.take());
        TimeUnit.SECONDS.sleep(3);
        System.out.println(Thread.currentThread().getName() + "<=>" + queue.take());
        TimeUnit.SECONDS.sleep(3);
        System.out.println(Thread.currentThread().getName() + "<=>" + queue.take());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}, "T2").start();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值