1.阻塞队列:
对于许多线程问题,可以通过使用一个或多个队列以优雅且安全的方式将其形式化。使用队列可以安全地从一个线程向另一个线程传递数据。例如,银行转账程序,转账线程将转账指令对象插入一个队列中,而不是直接访问银行对象。另一个线程从队列中取出指令执行转账。只有该线程可以访问该银行对象的内部。因此就不需要同步了。
当试图向队列添加元素而队列已满,或是想从队列中移出元素而队列为空时,阻塞队列导致线程阻塞。工作者线程可以周期性地将中间结果存储到阻塞队列中。其他的工作者线程移出中间结果并进一步加以修改。队列会自动的平衡负载。在相邻的线程存在快慢的情况下会进行平衡。
阻塞队列方法:
java.util.concurrent包提供了阻塞队列的几个变种。
LinkedBlockingQueue在默认情况下的容量是没有上限的,但是,也可以指定容量。LinkedBlockingQueue是双端的版本。
ArrayBlockingQueue在构造时需要指定容量,并且需要一个可选的参数来指定是否需要公平性。如果设置了公平参数,那么等待了最长时间的线程会优先得到处理,但是这样会降低性能。
PriorityBlockingQueue是一个带有优先级的队列,该队列没有上限,但是在空队列时取元素则会阻塞。
DelayQueue包含实现Delayed接口的对象,getDelay方法返回对象的残留延迟。负值表示延迟结束。元素只有在延迟用完的情况下才能从DelayQueue移除。还必须实现compareTo方法用于排序。
Java SE 7增加了一个TransferQueue接口,允许生产者线程等待,直到消费者线程准备好。LinkedTransferQueue类实现了这个接口。
2.java.util.concurrent.ArrayBlockingQueue<E> 5.0:
ArrayBlockingQueue(int capacity)
ArrayBlockingQueue(int capavity, boolean fair)
构造一个带有指定的容量和公平性设置的阻塞队列。该队列用循环数组实现。
3.java.util.concurrent.LinkedBlockingQueue<E>/java.util.concurrent.LinkedBlockingDeque<E> 5.0:
LinkedBlockingQueue()
LinkedBlockingDeque()
构造一个无上限的阻塞队列或双向队列,用链表实现。
LinkedBlockingQueue(int capacity)
LinkedBlockingDeque(int capacity)
根据指定容量构造。。。
4.java.util.concurrent.DelayQueue<E extends Delayed> 5.0:
DelayQueue()
构造一个包含Delayed元素的无界的阻塞时间有限的阻塞队列。只有那些延迟已经超过时间的元素可以从队列中移出。
5.java.util.concurrent.Delayed 5.0:
long getDelay(TimeUnit unit)
得到该对象的延迟,用给定的时间单位进行度量。
6.java.util.concurrent.PriorityBlockingQueue<E> 5.0:
PriorityBlockingQueue()
PriorityBlockingQueue(int initialCapacity)
PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator)
构造一个无边界阻塞优先队列,用堆实现。
7.java.util.concurrent.BlockingQueue<E> 5.0:
void put(E element)
添加元素。
E take()
移除并返回头元素,必要时阻塞。
boolean offer(E element, long time, TimeUnit unit)
添加给定元素,如果成功返回true,如果必要时阻塞,直至元素已经被添加或超时。
E poll(long time, TimeUnit unit)
移除并返回头元素,必要时阻塞,直至元素可用或超时用完。失败返回null。
8.java.util.concurrent.BlockingDeque<E> 6:
void putFirst(E element)
void putLast(E element)
添加元素,必要时阻塞。
E takeFirst()
E takeLast()
移除并返回头元素或尾元素,必要时阻塞。
boolean offerFirst(E element, long time, TimeUnit unit)
boolean offerLast(E element, long time, TimeUnit unit)
添加给定的元素,成功时返回true,必要时阻塞直至元素被添加或超时。
E pollFirst(long time, TimeUnit unit)
E pollLast(long time, TimeUnit unit)
移动并返回头元素或尾元素,必要时阻塞,直至元素可用或超时。失败时返回null。
9.java.util.concurrent.TransferQueue<E> 7:
void transfer(E element)
boolean tryTransfer(E element, long time, TimeUnit unit)
传输一个值,或者尝试在给定的超时时间内传输这个值,这个调用将阻塞,直到另一个线程将元素删除。第二个方法会在调用成功时返回true。