BlockingQueue中add,offer,put方法区别
2017-07-19 23:29
447 查看
DK8中继承了BlockingQueue接口的类,如LinkedBlockingQueue,添加元素都有3种方法add,offer,put。
2
3
4
5
6
7
1
2
3
4
5
6
7
将指定的元素插入到此队列中(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用空间,则抛出 IllegalStateException。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
将指定元素插入到此队列的尾部(如果立即可行且不会超出此队列的容量),在成功时返回 true,如果此队列已满,则返回 false。当使用有容量限制的队列时,此方法通常要优于 add 方法,后者可能无法插入元素,而只是抛出一个异常。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
将指定元素插入到此队列的尾部,如有必要,则等待空间变得可用。
对应remove,poll,take方法也有类似区别
add
public boolean add(E e) { if (offer(e)) return true; else throw new IllegalStateException("Queue full"); }1
2
3
4
5
6
7
1
2
3
4
5
6
7
将指定的元素插入到此队列中(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用空间,则抛出 IllegalStateException。
offer
/** * Inserts the specified element at the tail of this queue if it is * possible to do so immediately without exceeding the queue's capacity, * returning {@code true} upon success and {@code false} if this queue * is full. * When using a capacity-restricted queue, this method is generally * preferable to method {@link BlockingQueue#add add}, which can fail to * insert an element only by throwing an exception. * * @throws NullPointerException if the specified element is null */ public boolean offer(E e) { if (e == null) throw new NullPointerException(); final AtomicInteger count = this.count; if (count.get() == capacity) return false; int c = -1; Node node = new Node(e); final ReentrantLock putLock = this.putLock; putLock.lock(); try { if (count.get() < capacity) { enqueue(node); c = count.getAndIncrement(); if (c + 1 < capacity) notFull.signal(); } } finally { putLock.unlock(); } if (c == 0) signalNotEmpty(); return c >= 0; }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
将指定元素插入到此队列的尾部(如果立即可行且不会超出此队列的容量),在成功时返回 true,如果此队列已满,则返回 false。当使用有容量限制的队列时,此方法通常要优于 add 方法,后者可能无法插入元素,而只是抛出一个异常。
put
/** * Inserts the specified element at the tail of this queue, waiting if * necessary for space to become available. * * @throws InterruptedException {@inheritDoc} * @throws NullPointerException {@inheritDoc} */ public void put(E e) throws InterruptedException { if (e == null) throw new NullPointerException(); // Note: convention in all put/take/etc is to preset local var // holding count negative to indicate failure unless set. int c = -1; Node node = new Node(e); final ReentrantLock putLock = this.putLock; final AtomicInteger count = this.count; putLock.lockInterruptibly(); try { /* * Note that count is used in wait guard even though it is * not protected by lock. This works because count can * only decrease at this point (all other puts are shut * out by lock), and we (or some other waiting put) are * signalled if it ever changes from capacity. Similarly * for all other uses of count in other wait guards. */ while (count.get() == capacity) { notFull.await(); } enqueue(node); c = count.getAndIncrement(); if (c + 1 < capacity) notFull.signal(); } finally { putLock.unlock(); } if (c == 0) signalNotEmpty(); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
将指定元素插入到此队列的尾部,如有必要,则等待空间变得可用。
对应remove,poll,take方法也有类似区别
相关文章推荐
- BlockingQueue中add,offer,put方法区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别(转)
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- 队列的add()方法和offer()方法的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add跟offer的区别
- LinkedBlockingQueue的put,add,offer和poll,remove,take的区别
- java中list的add与addall方法区别
- struts2 中的 addActionError 、addFieldError、addActionMessage方法的区别
- Jquery中.css()与.addClass()两种方法设置样式的区别