gpt4 book ai didi

java - Java 执行器中无界队列的用例是什么?

转载 作者:行者123 更新时间:2023-12-02 05:37:19 24 4
gpt4 key购买 nike

Java 的

Executors 工厂使用无界的挂起任务队列。例如,Executors.newFixedThreadPool 使用 new LinkedBlockingQueue,它对接受的任务没有限制。

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

当新任务到达并且没有可用线程时,它会进入队列。任务可以无限期地添加到队列中,从而导致 OutOfMemoryError

实际使用这种方法的场景是什么?为什么 Java 的创建者不使用有界队列?我无法想象无界比有界更好的场景,但我可能会错过一些东西。有人可以提供一个合理的解释吗?最好的!

最佳答案

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

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

处理有界队列其实比较难,如果队列满了怎么办?您放弃任务并且不接受它?您抛出异常并导致整个过程失败?这难道不是 OOM 情况下会发生的情况吗?因此,所有这些都是需要接受大量长时间运行任务的用户做出的决定,该用户不是默认的 Java 用户。

无界队列的用例可能只是当您只期望少量正在运行的并发请求,但您不知道到底有多少,或者您可以在应用程序的不同阶段实现背压,例如限制 API 请求.

关于java - Java 执行器中无界队列的用例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53913601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com