回答·10
最热
最新
- 只要实现了 BlockingQueue 的类都可以作为线程池的传递队列,一般有三种策略 1.直接传递,如 SynchronousQueue,队列不持有请求,直接尝试获取或创建线程,该策略在处理可能具有内部依赖项的请求集时避免锁定,通常需要无限制的线程数支持。 2.无界队列,如 LinkedBlockingQueue,当线程数达到核心线程数,请求进来直接入队,可以平滑请求的短暂爆发,当请求到达比线程处理速度更快,工作队列会无限制增长。 3.有界队列,如 ArrayBlockingQueue,在使用有限制的最大线程数时防止资源耗尽,要经常在系统资源和吞吐量之间进行调整,根据任务类型调整队列和池的大小。
- 好像是四种,好像默认的是 list 的阻塞队列
- ArrayBlockingQueue 基于数组的有限阻塞队列,插入数据和取出数据公用一个锁对象。先进先出原则 LinkedBlockingQueue 基于链表的阻塞队列。先进先出原则。newFixedThreadPool 和 newSingleThreadExecutor 使用这个队列 SynchronousQueue 不存储元素的阻塞队列,插入操作必须等待一个线程调用移除操作,否则一直会阻塞。newCachedTHreadPool 使用这个队列 PriorityBlockingQueue 有优先级的无限阻塞队列,基于最小二叉堆实现 DelayedWorkQueue 每个元素指定延时时间,只有当时间到了才能从队列中获取该元素,是一个无限队列。
- arrayblockingqueue,是一个基于数组的有界阻塞队列,此队列按 FIFO 原则对元素进行排序 linkedblockingqueue,一个基于连表结构的阻塞队列,此队列按 FIFO 排序元素,吞吐量通常要高于 arrayblockingqueue。静态工厂方法 executors.newfIxedThreadPOOL()使用了这个队列 SynchronusQueue,一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常高于 linkedblockingqueue,静态工厂方法 executors.newCAchedThreadPool(5)使用了这个队列 PriorityBlockingQueue 一个具有优先级的无线阻塞队列
- java 原生线程池的话,貌似只要实现阻塞队列接口就行。应该是分为基于数组和链表的两种类型。队列有无限长的,有固定长的,有长度为 0 的,有实现比较接口分优先级的。
- ArrayBlockingQueue LinkedBlockingQueue DelayQueue PriorityBlockingQueue SynchronousQueue
- 1.先进先出 顺序 2.先进后出 堆栈 3.优先级别 选择
- 七总:初始,运行,结束,等待,锁池,等待,阻塞
- 7 个 分别是是处理线程高并发下的使用
- 初始 就绪 运行 阻塞 死亡