- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 ThreadPoolExecutor 来安排任务,但在其策略方面遇到了一些问题。这是其声明的行为:
我想要的行为是这样的:
基本上我不希望任何任务被拒绝;我希望他们在无界队列中排队。但我确实希望拥有最多 maximumPoolSize 线程。如果我使用无界队列,它在达到 coreSize 后永远不会生成线程。如果我使用有界队列,它会拒绝任务。有什么办法解决这个问题吗?
我现在考虑的是在 SynchronousQueue 上运行 ThreadPoolExecutor,但不是直接向它提供任务 - 而是将它们提供给一个单独的无界 LinkedBlockingQueue。然后另一个线程从 LinkedBlockingQueue 进入 Executor,如果一个线程被拒绝,它会再次尝试直到没有被拒绝。不过,这似乎很痛苦,而且有点麻烦 - 有没有更简洁的方法来做到这一点?
最佳答案
可能没有必要根据请求对线程池进行微观管理。
缓存线程池将重新使用空闲线程,同时还允许潜在的无限并发线程。这当然会导致突发期间上下文切换开销导致性能失控。
Executors.newCachedThreadPool();
更好的选择是对线程总数进行限制,同时放弃确保首先使用空闲线程的概念。配置更改为:
corePoolSize = maximumPoolSize = N;
allowCoreThreadTimeOut(true);
setKeepAliveTime(aReasonableTimeDuration, TimeUnit.SECONDS);
根据这种情况推理,如果执行程序的线程少于 corePoolSize
,那么它一定不会很忙。如果系统不是很忙,那么启动一个新线程也没什么坏处。这样做会导致您的 ThreadPoolExecutor
在低于允许的最大工作人员数量时始终创建一个新工作人员。只有当最大数量的worker在“运行”时,才会给空闲等待任务的worker分配任务。如果工作人员在没有任务的情况下等待 aReasonableTimeDuration
,则允许终止。对池大小使用合理的限制(毕竟,只有这么多 CPU)和相当大的超时(以防止线程不必要地终止),可能会看到预期的好处。
最后一个选项是骇人听闻的。基本上,ThreadPoolExecutor
在内部使用 BlockingQueue.offer
来确定队列是否有容量。 BlockingQueue
的自定义实现总是可以拒绝 offer
尝试。当 ThreadPoolExecutor
无法向队列提供
任务时,它将尝试创建一个新的 worker。如果无法创建新的 worker,则会调用 RejectedExecutionHandler
。此时,自定义 RejectedExecutionHandler
可以强制将 put
放入自定义 BlockingQueue
。
/** Hackish BlockingQueue Implementation tightly coupled to ThreadPoolexecutor implementation details. */
class ThreadPoolHackyBlockingQueue<T> implements BlockingQueue<T>, RejectedExecutionHandler {
BlockingQueue<T> delegate;
public boolean offer(T item) {
return false;
}
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
delegate.put(r);
}
//.... delegate methods
}
关于java - ThreadPoolExecutor 政策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3419380/
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我需要准备一个关于 iOS 移动设备管理的演示文稿。我被要求包括已实现的政策并选择其中一项并详细描述。问题是,我不知道存在哪些不同的政策。请帮帮我。 最佳答案 这里是您需要了解的有关 MDM 和 MD
我正在尝试使用 ThreadPoolExecutor 来安排任务,但在其策略方面遇到了一些问题。这是其声明的行为: 如果运行的线程少于 corePoolSize,执行器总是倾向于添加新线程而不是排队。
这是默认 Adsense 代码的示例, (adsbygoogle = window.adsbygoogle || []).push({}); 缩小后, “双引号”从代码中剥离。 (ad
假设我有一个模型用户,它可以有多个房子。这些房子可以有多个 parking 位,然后可以有多个汽车或自行车 用户 > 房屋 > parking 位 > [汽车、自行车] 如何检查汽车是否与用户相关?
我有一个管理 iOS 设备的 mdm 服务器。我们已经完成了在设备上安装 mdm 配置文件的所有步骤。此外,我们还应用了适用于设备和 Wi-Fi 等配置的所有政策。 问题 1: 当我们发送“allow
请问如何使用 C# 编辑 gpedit.msc 策略? 最佳答案 gpedit.msc 只是注册表设置的一个接口(interface); gpedit 没有 API 或暴露的框架。要像 gpedit
当我尝试运行我的网站时,它显示 500 internal server error : Internal Server Error The server encountered an internal
在 Play 商店中发布新内容时,它会在下面询问 如果您的应用的某些部分因登录凭据、成员(member)资格、位置或其他形式的身份验证而受到限制,请提供详细信息,以便 Google 审核您的应用 -
我在我应用的admin部分中使用pundit进行访问控制。我有一个仪表板 Controller ,如下所示: class Admin::DashboardsController < AdminCont
我写了一个 Chrome 扩展,它使用本地存储。 当我打开 chrome://policy/在浏览器中,我可以根据其 ID 查看我的扩展程序的数据,但是,当我在注册表中手动更改该值时,它不会自动更新。
当在 Cassandra 中使用 token 感知策略作为负载平衡策略时,所有查询都会自动通过正确的节点发送(其中包含副本,例如 select * from Table wherepartionkey
我想在同一事件中同时展示横幅广告和插页式广告。但我不确定这是否会违反 Google admob 政策,因为当显示插页式广告时,它会覆盖横幅广告。 谢谢。 最佳答案 这是允许的。事实上,建议您这样做以增
您好,我想知道是否通过设置 User Interface Style 来强制我的应用程序进入灯光模式至Light在 plist 中可能会导致我的应用程序被拒绝?? 最佳答案 Official Docu
我想在同一事件中同时展示横幅广告和插页式广告。但我不确定这是否会违反 Google admob 政策,因为当显示插页式广告时,它会覆盖横幅广告。 谢谢。 最佳答案 这是允许的。事实上,建议您这样做以增
我在我的应用程序中使用 Navigation-Drawer。所以我用 navigation_drawer 布局创建了单个 Activity 。每当用户从抽屉导航菜单中选择菜单选项时,我都会使用 fra
我在弄清楚 sails 政策时遇到困难,我按照教程进行操作,但仍然无法使其工作。 在我的policies.js 文件中: module.exports.policies = { '*':true,
我开始收到很多类似这样的 sails 政策: ... 'MyController':{ 'some': ['runPassport', 'isLoggedIn', 'ensureTotpOkI
如何在 htmlunit 中指定 cookie 策略以接受所有 cookie? 最佳答案 只需重新创建整个 CookieManager 类:这是类(class)的来源:http://jarvana.c
我是一名优秀的程序员,十分优秀!