BlockingQueue
BlockingQueue要求当队列为空或满时就会阻塞线程
方式 | 有返回值,抛出异常 | 有返回值,不抛出异常 | 没有返回值,阻塞等待 | 有返回值,超时等待 |
---|---|---|---|---|
添加 | add() | offer() | put() | offer(..) |
移除 | remove() | poll() | take() | poll(..) |
检测队首元素 | element() | peek() | - | - |
public static void main(String[] args) {
// 3代表队列的容量
BlockingQueue<String> objects = new ArrayBlockingQueue<>(3);
objects.add("a");
objects.add("c");
objects.add("b");
//objects.add("d"); 报错Queue full
//System.out.println(objects.offer("d"));输出false
// objects.put("d"); 阻塞等待
//objects.offer("d",2, TimeUnit.SECONDS);等待两秒,超时放弃.2代表时间,TimeUtil.Seconds代表时间单位
System.out.println(objects.remove());
System.out.println(objects.remove());
System.out.println(objects.remove());
//System.out.println(objects.remove());//报错NoSuchElementException
//System.out.println(objects.poll()); 输出null
//objects.take();阻塞等待
//objects.poll(2,TimeUnit.SECONDS);等待两秒,超时放弃
}
SynchronousQueue 同步队列
没有容量,放完必须取。
public class BlockingQueueTest {
public static void main(String[] args) {
BlockingQueue<String > objects = new SynchronousQueue<>();
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+"put");
objects.put(String.valueOf(1));
System.out.println(Thread.currentThread().getName()+"put");
objects.put(String.valueOf(2));
System.out.println(Thread.currentThread().getName()+"put");
objects.put(String.valueOf(2));
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{
try {
Thread.sleep(2);
System.out.println(Thread.currentThread().getName()+"get"+objects.take());
Thread.sleep(2);
System.out.println(Thread.currentThread().getName()+"get"+objects.take());
Thread.sleep(2);
System.out.println(Thread.currentThread().getName()+"get"+objects.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
Thread-0put
Thread-1get1
Thread-0put
Thread-1get2
Thread-0put
Thread-1get2