LinkedBlockingQueue 复习看下表即可

Level.

放入

取出

1

add

队列满?​​异常​​:return true

remove

队列空?​​异常​​:return head

2

offer

队列满?return false:return true

poll

队列空?return null:return head

3

put

队列满?阻塞:return [void]

take

队列空?阻塞:return head

add、offer、put

BlockingQueue 的put、offer、add区别,看注释:

BlockingQueue<Object> taskQueue = new LinkedBlockingQueue<Object>(queueSize);
taskQueue.put(task); // 队列满?阻塞:return void
taskQueue.offer(task); // 队列满?return false:return true
taskQueue.add(task); // 队列满? 报异常:return true;

测试程序:

public static void main(String[] args) {
int queueSize = 2;
BlockingQueue<Object> taskQueue1 = new LinkedBlockingQueue<Object>(queueSize);
BlockingQueue<Object> taskQueue2 = new LinkedBlockingQueue<Object>(queueSize);
BlockingQueue<Object> taskQueue3 = new LinkedBlockingQueue<Object>(queueSize);

for (int i = 0; i < queueSize + 1; i++) {
System.out.println("================for " + (i + 1));
Object o = new Object();
try {
System.out.println("add:" + taskQueue1.add(o));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("offer:" + taskQueue2.offer(o));
try {
System.out.println("taskQueue3 size:" + taskQueue3.size());
taskQueue3.put(o);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

输出:

================for 1
add:true
offer:true
befor put ,taskQueue3 size:0
after put ,taskQueue3 size:1
================for 2
add:true
offer:true
befor put ,taskQueue3 size:1
after put ,taskQueue3 size:2
================for 3
java.lang.IllegalStateException: Queue full
at java.util.AbstractQueue.add(AbstractQueue.java:98)
at com.yh.stu.concurrent.dp.threadpool.dmjuc.DMThreadPool.main(DMThreadPool.java:47)
offer:false
befor put ,taskQueue3 size:2

输出最后一行缺少了​​after put ,taskQueue3 size:3​​​, 因为taskQueue3 满了,​​taskQueue3.put(o)​​ 阻塞等待

2、remove、poll、take

看注释:

taskQueue3.remove();  // 队列空?异常:return head;
taskQueue3.poll(); // 队列空?return null:return head;
taskQueue3.take(); // 队列空?阻塞:return head;

测试程序:

public static void main(String[] args) {
int queueSize = 2;
BlockingQueue<Object> taskQueue1 = new LinkedBlockingQueue<Object>(queueSize);
BlockingQueue<Object> taskQueue2 = new LinkedBlockingQueue<Object>(queueSize);
BlockingQueue<Object> taskQueue3 = new LinkedBlockingQueue<Object>(queueSize);
new Thread(new Runnable() {
@Override
public void run() {
ThreadUtils.sleep(1000);
try {
taskQueue3.take(); // 队列空?阻塞:return head;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
for (int i = 0; i < queueSize + 1; i++) {
System.out.println("================for " + (i + 1));
Object o = new Object();
try {
System.out.println("add:" + taskQueue1.add(o));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("offer:" + taskQueue2.offer(o));
try {
System.out.println("befor put ,taskQueue3 size:" + taskQueue3.size());
taskQueue3.put(o);
System.out.println("after put ,taskQueue3 size:" + taskQueue3.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

3、总结

Level.

放入

取出

1

add

队列满?​​异常​​:return true

remove

队列空?​​异常​​:return head

2

offer

队列满?return false:return true

poll

队列空?return null:return head

3

put

队列满?阻塞:return [void]

take

队列空?阻塞:return head