第一组 —> 抛出异常:
/**
* 抛出异常
* 添加移除的操作 超出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();