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项目控制台中文乱码
