当前位置: 首页 > 面试题库 >

使用ThreadPoolExecutor的活动任务数

祝叶五
2023-03-14
问题内容

我正在使用ThreadPoolExecutor在Java应用程序中执行任务。我有一个要求,我想在任何时间获取执行者队列中队列中活动任务的数量。我查看了ThreadPoolExecutor
javadoc,发现了两个相关方法:getTaskCount()getCompletedTaskCount()

根据文档,我可以分别通过上述两种方法获得计划任务和完成任务的数量。但是我找不到能够在任何时间获取队列中活动任务数量的解决方案。我可以做类似的事情:

getTaskCount() = getCompletedTaskCount() + failed tasks + active tasks

但是失败的任务数量不能直接获得以进行预期的计算。

我在这里想念什么吗?


问题答案:

我认为您无需通过尝试使用的计算来了解失败的计数。

long submitted = executor.getTaskCount();
long completed = executor.getCompletedTaskCount();
long notCompleted = submitted - completed; // approximate

将(大约)足够。

或者,你可以用getQueue()size()

int queued = executor.getQueue().size();
int active = executor.getActiveCount();
int notCompleted = queued + active; // approximate

该答案假设您要查找“尚未完成”的计数。 您的问题自相矛盾,因此我不确定您要问什么。如果这不正确,请回复我对您问题的评论,我将相应地更新此答案。



 类似资料:
  • 据我所知,Camunda提供了两种将Java代码与服务任务集成的方法: 1.)声明一个实现JavaDelegate接口的Spring-Bean(该方法将一个DelegateExecution作为参数)。这个方法允许我存储任意多个结果变量,但我看不到定义映射process-variable->input-variable的选项。 2.)声明一个通用的Spring bean可由camunda访问,并定

  • 我已经实现了ThreadPoolExecutor来调用任务。而且,由于核心/队列大小的错误配置,任务似乎挂起在I/O上。我想拉出挂起的线程,以便队列中的其他线程开始执行。 有没有办法列出threadpoolexecutor中的线程并拉出挂起的线程?

  • 我试图找到一种在以下场景中使用ThreadPoolExecutor的方法: 我有一个单独的线程在线程池中生成和提交任务 为了提供更多的上下文,我目前只需一次提交所有任务,并取消ExecutorService返回的所有未来。在最长生成时间到期后提交。我忽略所有产生的取消异常,因为它们是预期的。问题是未来的行为。cancel(false)很奇怪,不适合我的用例: 它可以防止任何未启动的任务运行(良好)

  • 我正在ThreadPoolExecutor中运行多个任务。我将其初始化如下: 我自己实现了runnable(),其中包含一个方法来跟踪提交任务的进度。我提交的实例如下: 我正在寻找一种查询当前/挂起线程的执行器/阻塞队列的方法。我尝试使用jobQueue。toArray()和重写executor方法但在这两种情况下,返回的Runnable都是FutureTask类型,不包含太多数据。有没有一种方法

  • 从java文档, ForkJoinPool不同于其他类型的ExecutorService,主要是因为它采用了工作窃取:池中的所有线程都试图查找并执行其他活动任务创建的子任务(如果不存在,则最终阻塞等待工作)。 当大多数任务产生其他子任务时(就像大多数ForkJoinTasks一样),这可以实现高效处理。当在构造函数中将asyncMode设置为true时,ForkJoinPools也可能适合用于从未

  • 问题内容: 我对ThreadPoolExecutor有一个非常简单的问题。我有以下情况:我必须使用队列中的对象,为它们创建适当的工作程序任务,然后将其提交给ThreadPoolExecutor。这很简单。但是在关闭情况下, 许多 工作人员可能会排队等待执行。由于这些任务之一可能正在运行一个小时,而且我希望相对快速地正常关闭应用程序,因此我想从ThreadPoolExecutor中丢弃所有排队的任务