BlockingQueue
/** * * @描述: 队列(阻塞/非阻塞)、LinkedQueue不固定大小 * 先进先出,如队列大小为8,如放进了8个数据,就不能继续放了,会进入阻塞,如果是非阻塞队列则会报错 * * Throwsexception Special value()返回值判断 Blocks(阻塞) Times out Insert add(e) offer(e) put(e) offer(e, time, unit) Remove remove() poll() take() poll(time, unit) Examine element() peek() not applicable not applicable Java中的原子性,是指:原子操作是不能被线程调度机制中断的;操作一旦开始,它一定会在可能发生的“上下文切换”(即切换到其他线程执行) 之前执行完毕。 但是千万不要认为“原子操作不需要同步控制(这是错误的)” * @作者: Wnj . * @创建时间: 2017年5月16日 . * @版本: 1.0 . */ public class BlockingQueueTest { public static void main(String[] args) { final BlockingQueue queue = new ArrayBlockingQueue(3); for (int i = 0; i < 2; i++) { new Thread() { public void run() { while (true) { try { Thread.sleep((long)(Math.random() * 1000)); System.out.println(Thread.currentThread().getName() + "准备放数据!"); queue.put(1);//实现互斥,但不能保证打印是原子性的 System.out.println(Thread.currentThread().getName() + "已经放了数据," + "队列目前有" + queue.size() + "个数据"); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } new Thread() { public void run() { while (true) { try { //将此处的睡眠时间分别改为100和1000,观察运行结果 Thread.sleep(1000); System.out.println(Thread.currentThread().getName() + "准备取数据!"); queue.take(); System.out.println(Thread.currentThread().getName() + "已经取走数据," + "队列目前有" + queue.size() + "个数据"); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } }