当前位置: 首页 > 知识库问答 >
问题:

Java Executors中无界队列的用例是什么?

邢骏
2023-03-14
public static ExecutorService newFixedThreadPool(int nThreads) {
  return new ThreadPoolExecutor(nThreads, nThreads,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>());
}

实际使用这种方法的场景是什么?为什么Java创建者没有使用有界队列?我无法想象无界比有界更好的情况,但我可能错过了什么。有人能提供一个像样的解释吗?最好!

共有1个答案

上官鸿朗
2023-03-14

这是默认方法,用户可以选择更改为有界队列。

现在也许你的问题是为什么这是默认的?

处理有界队列实际上更难,如果队列满了,你会怎么做?你放弃任务不接受?你抛出一个异常并使整个过程失败?在Oom的情况下不就是这样吗?因此,所有这些都需要由接受大量长时间运行任务的用户做出决定,而不是默认的Java用户。

无界队列的一个用例可能是当您只期望少量的并发请求运行,但您不知道确切的数量,或者您可以在应用程序的不同阶段实现反压力,比如节流API请求。

 类似资料:
  • 这是为编写的: 有界队列。当与有限的maximumPoolSizes一起使用时,有界队列(例如ArrayBlockingQueue)有助于防止资源耗尽,但可能更难调优和控制。队列大小和最大池大小可以相互权衡:使用大队列和小池可以最大限度地减少CPU使用量、OS资源和上下文切换开销,但可能会导致人为的低吞吐量。如果任务经常阻塞(例如,如果它们是I/O绑定的),系统可能能够为更多的线程安排时间,而不是

  • 队列,和 栈一样,也是一种对数据的"存"和"取"有严格要求的 线性存储结构。 与栈结构不同的是, 队列的两端都"开口",要求数据只能从一端进,从另一端出,如图 1 所示: 图 1 队列存储结构 通常,称进数据的一端为 "队尾",出数据的一端为 "队头",数据元素进队列的过程称为 "入队",出队列的过程称为 "出队"。 不仅如此, 队列中数据的进出要遵循 "先进先出" 的原则,即最先进队列的数据元素

  • 队列是项的有序结合,其中添加新项的一端称为队尾,移除项的一端称为队首。当一个元素从队尾进入队列时,一直向队首移动,直到它成为下一个需要移除的元素为止。 最近添加的元素必须在队尾等待。集合中存活时间最长的元素在队首,这种排序成为 FIFO,先进先出,也被成为先到先得。 队列的最简单的例子是我们平时不时会参与的列。排队等待电影,在杂货店的收营台等待,在自助餐厅排队等待(这样我们可以弹出托盘栈)。行为良

  • 有人能解释一下Android中的消息队列是什么吗?是正在运行的进程列表吗?我找不到很好的消息来源来解释。 我之所以这样问,是因为我读到了类视图的方法帖子。 邮政 导致将Runnable添加到消息队列中。runnable将在用户界面线程上运行。 提前谢谢你。

  • 目前我们有LinkedBlockingQueue和Con的LinkedQueue。 LinkedBlockingQueue可以有界,但它使用锁。 ConcurrentLinkedQueue不使用锁,但它不受限制。而这并不是阻碍投票的原因。 显然,我不能有一个既阻塞又无锁的队列(无等待或非阻塞或其他东西)。我不要求学术定义。 有人知道一个队列实现,它基本上是无锁的(不在热路径中使用锁),空时阻塞(不

  • 简介 举个例子。我有一个用户表,这个表根据用户名被Hash到不同的数据库实例上,我要找出这些用户中最热门的5个,怎么做?我是这么做的: 在每个数据库实例上找出最热门的5个 将每个数据库实例上的这5条数据按照热门程度排序,最后取出前5条 这个过程看似简单,但是你应用服务器上的代码要写不少。首先需要Query N个列表,加入到一个新列表中,排序,再取前5。这个过程不但代码繁琐,而且牵涉到多个列表,非常