gpt4 book ai didi

java - Java 文档上的 ThreadPoolExecutor

转载 作者:行者123 更新时间:2023-11-30 09:50:30 26 4
gpt4 key购买 nike

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html您可以阅读构造函数的参数说明。特别是在“核心和最大池大小”段落中,它是这样写的:

If there are more than corePoolSize but less than maximumPoolSize threads running, a new thread will be created only if the queue is full.

...

By setting maximumPoolSize to an essentially unbounded value such as Integer.MAX_VALUE, you allow the pool to accommodate an arbitrary number of concurrent tasks.

现在我无法理解第一部分中的“仅当队列已满”代表什么...ThreadPoolExecutor 会等到队列已满,还是只会创建一个新工作线程?

现在假设我们有更多任务,它们之间不是异步的:使用 ThreadPoolExecutor 会导致死锁吗?假设我的前 10 个任务是生产者并且 CorePoolSize 是 10,那么后续的消费者任务将进入队列并且在队列满之前不会运行?如果是这样,此行为可能会导致死锁,因为前 10 个生产者可能会继续等待,挂起核心的所有 10 个线程。队列何时满?我不确定我是否理解了文档,因为 Executors.newCachedThreadPool() 似乎会创建一个新的 Worker 直到达到 maxPoolSize,然后它将任务发送到队列。我有点困惑。

谢谢

最佳答案

当你构造ThreadPoolExecutor时,你传入一个BlockingQueue<Runnable>的实例。称为 workQueue , 来保存任务,并且它是被引用的这个队列。

事实上,文档中名为“队列”的部分更详细地介绍了您感到困惑的短语:

Any BlockingQueue may be used to transfer and hold submitted tasks. The use of this queue interacts with pool sizing:

  • If fewer than corePoolSize threads are running, the Executor always prefers adding a new thread rather than queuing.
  • If corePoolSize or more threads are running, the Executor always prefers queuing a request rather than adding a new thread.
  • If a request cannot be queued, a new thread is created unless this would exceed maximumPoolSize, in which case, the task will be rejected.

至于你的第二部分,关于任务间的依赖关系——在这种情况下,我认为将它们放入 ExecutorService 根本不是一个好主意。 ExecutorService 非常适合在未来的某个时间点运行一段独立的代码,但根据设计,它并不意味着对何时发生这种情况具有很强的确定性,除了“在(希望不久的) future 某个方便的时间点,在先前排队的任务开始后。”

将计时精度的缺乏与并发操作强加的硬排序要求相结合,您可以看到将需要相互交谈的生产者和消费者放入通用 ExecutorService 中是一个秘诀对于非常烦人和令人困惑的错误。

是的,我相信您可以通过充分调整参数来让它工作。但是,不清楚它为什么起作用,不清楚依赖项是什么,而且何时(不是如果)它坏了,诊断起来会非常困难。 (我怀疑比正常的并发问题更难)。最重要的是,ExecutorService 并非设计用于运行具有严格时间限制的 Runnable,因此新版本的 Java 甚至可能会打破这一点,因为它必须这样工作。

我认为你问错了问题,当你的概念可能有点不稳定时查看细节。如果您解释了您想要实现的目标,也许会有更好的方法来实现它。

关于java - Java 文档上的 ThreadPoolExecutor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5145109/

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