java - 将任务从一个线程池转移到另一个线程池
问题描述
我有一个线程池执行器列表,每个大小为 50,我希望某个执行器在他们的队列中没有任何待处理的作业或运行的任务少于池大小,然后他们可以从另一个执行器队列中获取作业更多任务并执行。
所以我创建了另一个线程,它在某个时间间隔内运行以下方法并轮班工作,但它运行不正常。问题
- 即使我给定条件,添加的任务也比它们的池大小更多,而小于池大小,但我不知道为什么转移了更多任务。
- 假设 pool1 的任务较少,因此从 pool1 中的其他人添加任务然后以某种方式再次将 pool1 重新返回到另一个循环迭代中的某个其他池中,但工作不正常,它发生在许多池中。
有没有其他方法可以做到这一点。我不认为我这样做的方式很好,而且效果不佳。
请提出一种方法。
public void shiftTaskInIdleThreadPool() {
for(ThreadPoolExecutor executor : threadPoolExecutorsList){
if(executor.getCorePoolSize() > executor.getActiveCount()){
for (ThreadPoolExecutor executor1 : threadPoolExecutorList){
while(executor1.getQueue().size() > 0 && executor.getActiveCount() < executor.getCorePoolSize()){
executor.execute(executor1.getQueue().remove());
}
}
}
}
}
解决方案
推荐阅读
- python - python的random模块是如何生成随机数的?
- vue.js - 如何将颜色自定义仅应用于 VSCode 中的特定文件类型?
- three.js - 像素数据长度与缓冲区几何顶点长度不匹配 - Three.js
- python - 问题:时长在 60 到 200 分钟之间的电影长度与其平均收视率之间的关系
- angular - Angular Datatable 更新的数据在导出/排序/搜索时消失
- javascript - 在生产中出现此错误,但在开发中工作正常 - StripeInvalidRequestError: The `line_items` parameter is required in payment mode
- python - 当我添加 id 号 /id 时,我无法在浏览器中加载我的方法
- node.js - 我使用 force:false 如果表已经存在或者我创建 sequilize 现在如何
- node.js - 使用多个参数 Node.js 查询 Postgres
- github - 如何从 github 为作曲家编译项目但不使用作曲家存储库?