java 阻塞队列、同步队列总结
阻塞队列
public class demo1 { /** * 阻塞队列 * <p> * 会抛出异常 * java.lang.IllegalStateException: Queue full * <p> * java.util.NoSuchElementException * @param args */ public static void main(String[] args) { ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3); queue.add(1); queue.add(2); queue.add(3); // queue.add(4); System.out.println(queue.remove()); System.out.println(queue.remove()); System.out.println(queue.remove()); System.out.println(queue.remove()); } }
同步队列
public class demo5 { /** * 同步队列 * 没有容量, * 进去一个元素,必须等待取出来之后,才能再往里面放一个元素! * * @param args */ public static void main(String[] args) throws InterruptedException { /** * 同步队列不存在容量的问题,它本身不存放元素, * * put值之后, 必须take取出, 否则就不能继续put元素, 就会一直等待take元素 */ SynchronousQueue<Object> 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); } catch (InterruptedException e) { e.printStackTrace(); } }, "a").start(); new Thread(() -> { try { TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName() + "-> take" + 1); queue.take(); TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName() + "-> take" + 2); queue.take(); } catch (InterruptedException e) { e.printStackTrace(); } }, "b").start(); } }
上一篇:
IDEA上Java项目控制台中文乱码