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

threadpoolexecutor中工作线程和工作队列的用途

苏乐童
2023-03-14

根据我的理解,ThreadpoolExecitor有两个主要的数据结构(工人,workQueue)用于管理tasks.worker(Set)有线程,这些线程将一直运行到执行器关闭,workerQueue将所有任务保留到执行器。但是根据代码,我没有看到所有任务都被添加到workQ中ueue.task仅在第1361行添加到队列中,不会在每种情况下都执行。

共有1个答案

陶星渊
2023-03-14

实际上不,workQueue实际上并没有保留提交给执行器的所有任务。这是#执行(Runnable)的主要部分(以此为参考,您可能使用蕨类植物反编译源或不同版本或其他);

 1323           int c = ctl.get();
 1324           if (workerCountOf(c) < corePoolSize) {
 1325               if (addWorker(command, true))
 1326                   return;
 1327               c = ctl.get();
 1328           }
 1329           if (isRunning(c) && workQueue.offer(command)) {
 1330               int recheck = ctl.get();
 1331               if (! isRunning(recheck) && remove(command))
 1332                   reject(command);
 1333               else if (workerCountOf(recheck) == 0)
 1334                   addWorker(null, false);
 1335           }
 1336           else if (!addWorker(command, false))
 1337               reject(command);

此代码有3个步骤:

  1. 检查执行者是否可以添加工作人员。如果可以,请使用新工人

与您的问题相关的案例是第一步,在此步骤中,代码在添加任何内容之前返回。事实上,情况并非如此,Worker的构造函数有一个runnable参数,这是它的第一个任务。每当TPE添加新工作线程时,提交的runnable是该工作线程中运行的第一个任务。如果找到第一个任务,runWorker(Worker)方法将运行该任务,或者等待前面提到的工作队列中出现任务。

 类似资料:
  • rabbitMQ 工作队列 轮询分发 >[danger] 简单队列是一对一的关系,一个生成者对应一个消费者,实际开发中,一般消费者是以业务相结合的,需要时间去处理业务,如果只有一个消费者,那么生产者就会积压很多消息,消费不出去 代码演示: 'use strict'; const Controller = require('egg').Controller; /** * 队列一对多演示 * 生产

  • 工作队列接口 结构体 struct   rt_workqueue   工作队列控制块 更多...   struct   rt_work   工作回调函数信息 更多...   函数 struct rt_workqueue *  rt_workqueue_create (const char *name, rt_uint16_t stack_size, rt_uint8_t priority)   创

  • 我正在使用Hystrix库处理网络调用。这是我用于线程池配置的内容 我正在使用公共的HytrixCommandKey和HytrixThreadPoolKey创建一个包含1000个HytrixCommand对象的加载。但是线程池在服务前100个线程之后执行回退逻辑,而不是使用threadpool队列。这可以通过将threadpool,coreSize设置为1000来解决。但我使用的是java,将co

  • 将是什么 线程不足,无法执行工作流。如果此消息始终显示,请选择WorkerOptions。应减小maxConcurrentWorklfowExecutionSize或WorkerOptions。maxWorkflowThreads增加。 处于阻塞状态的工作流在内存中保持活动状态??处于等待状态的工作流是否持续检查条件??更多的 -

  • 如果正在运行的线程少于corePoolSize线程,则执行器宁愿添加一个新线程,而不是排队。2)如果corePoolSize或更多线程正在运行,则执行器更喜欢将请求排队,而不是添加新线程。 如果请求无法排队,将创建一个新线程,除非该线程将超过maximumPoolSize,在这种情况下,任务将被拒绝。 第一种情况是可以的,但我想要的是,当核心线程被利用时,任务不需要排队(即使在有界队列的情况下,比

  • 我试图在容器启动并运行后运行以下命令。 " 然而,这完全破坏了我的容器启动。 我应该如何以Docker的方式来做这件事? 编辑: 使用docker-comact我添加了这一行到我的docker-compose.yml文件 容器启动了,但没有提供任何请求:S 使用此选项: 启动后容器停止运行 最终解决方案 所以最后我想,也许负责交付应用程序的服务器不应该是运行队列的服务器。 因此,我启动了同一doc