繁华事散逐香尘,流水无情草自春。——杜牧《金谷园》
JDK7提供了7个阻塞队列。(也属于并发容器) | |
---|---|
1.ArrayBlockingQueue | 一个由数组结构组成的有界阻塞队列FIFO。(一个 ReentrantLock lock;) |
2.LinkedBlockingQueue | 一个由链表结构组成的任意大小的线程安全的阻塞队列FIFO(为生产者消费者的首选。)(锁分离,两个锁takeLock、putLock) |
3.PriorityBlockingQueue | 一个支持优先级排序的无界阻塞队列按优先级出队(小堆实现) |
4.DelayQueue | 一个无界阻塞队列,只有在延迟期满时才能从中提取元素。 |
5.SynchronousQueue | 一个不存储元素的阻塞队列。 |
6.LinkedTransferQueue | 一个由链表结构组成的无界阻塞队列。 |
7.LinkedBlockingDeque | 一个由链表结构组成的双向阻塞队列。 |
线程池实例 | ||
---|---|---|
FixedThreadPool被称为可重用固定线程数的线程池 | FixedThreadPool 使用无界队列LinkedBlockingQueue 作为线程池的工作队列( 队列的容量为Integer.MAX_VALUE)。 | FixedThreadPool适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场合,适用于负载比较重的服务器。 |
SingleThreadExecutor是使用单个worker线程的Executor。 | SingleThreadExecutor 使用无界队列LinkedBlockingQueue 作为线程池的工作队列( 队列的容量为Integer.MAX_VALUE)。 | SingleThreadExecutor适用于需要保证顺序地执行各个任务;并且在任意时间点,不会有多个线程是活动的应用场景。 |
CachedThreadPool是一个会根据需要创建新线程的线程池。 | CachedThreadPool使用没有容量的SynchronousQueue作为线程池的工作队列,但CachedThreadPool的maximumPool是无界的。这意味着,如果主线程提交任务的速度高于maximumPool中线程处理任务的速度时,CachedThreadPool会不断创建新线程。极端情况下,CachedThreadPool会因为创建过多线程而耗尽CPU和内存资源。 | CachedThreadPool是大小无界的线程池,适用于执行很多的短期异步任务的小程序,或者负载较轻的服务器。 |
ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后运行任务,或者定期执行任务。 | 线程池中的线程从DelayQueue中获取ScheduledFutureTask,然后执行任务。 | 周期性或者延时任务 |