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

从执行器服务池(JAVA)中查找等待线程的作业数量?

苏季同
2023-03-14

我有一个服务器,它有多个使用java executorService实现的工作线程(即线程池)

我的问题是,我不能每秒记录一次,如果线程池中没有空闲线程可用,那么等待处理的作业的长度。

注意:日志记录不是我的问题,但我希望能够看到有多少任务/作业等待工作线程处理,是否仍然可以看到executor服务中等待队列(而不是线程池)的长度?

我不知道如何实现这个东西。

共有3个答案

张鸿宝
2023-03-14

就像建议使用ThreadPoolExecatorService而不是ExecutorService一样,您可以利用ThreadPoolExecator类中存在的阻塞队列。这将为您提供等待的线程数。

此外,ThreadPoolExecitor类具有获取已提交任务和已执行任务的计数的方法。

请参考

线程池

封锁队列

希望这有帮助

宗涵蓄
2023-03-14

如果您可以假设您的服务器使用的ExecutorService实现是ThreadPoolExecator,那么您可以使用方法getQueue()返回尚未分配给Worker的任务数。

/**
 * Returns the task queue used by this executor. Access to the
 * task queue is intended primarily for debugging and monitoring.
 * This queue may be in active use.  Retrieving the task queue
 * does not prevent queued tasks from executing.
 *
 * @return the task queue
 */
public BlockingQueue<Runnable> getQueue() {
    return workQueue;
}

所以你可以这样运行:

 if(LOGGER.isDebugEnabled()) {
    LOGGER.debug(String.format("Pending tasks: %d", executor.getQueue().size()));
 }
徐星阑
2023-03-14

ThreadPoolExecutor构造函数接受一个BlockingQueue参数,该参数是用于存储等待的作业的Queue实现。您可以使用getQueue()方法请求此队列,然后检查队列的大小:

System.out.println("Number of waiting jobs: "+executor.getQueue().size());

请注意,此方法在ExecutorService接口中不可用,因此最好显式构造ThreadPoolExecutor,而不是使用Executors。newFixedThreadPool和朋友:

ThreadPoolExecutor executor = new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());

而执行者。OpenJDK/OracleJDK中的newFixedThreadPool也执行相同的操作,没有指定它,因此使用(ThreadPoolExecutor)执行器。newFixedThreadPool(nThreads)可能会在未来的Java版本或替代JDK实现中导致ClassCastException

 类似资料:
  • 目前,我正在使用一个围绕脚本共享的执行器服务的全局实例。我的想法是调用并将任务添加到池中,以便线程进行工作,当所有线程都完成时,然后写入输出文件以获取结果。 下面是一个小视图:主线程调用t0、t1、t2、t3,t0调用t4、t5。其他线程也可以调用其他线程。 问题是shutdown()和awaitTermination()在t0、t1、t2、t3时被调用并完成,而没有等待t4和t5。因此,当t4和

  • 我已经实现了一个线程池。现在,它的基本操作如下: 空初始化(布尔detached_threads); bool调度(ulux(*dispatch_fn)(ulux), ulux arg, boolfree_arg); void shut\u down(); 静态无效*execute_task(无效*arg); 现在我想添加等待()操作,它将由主线程调用,并等待线程池中的所有线程完成它们正在执行的任

  • 在我的项目中,我正在构建一个Java的执行框架,它接收来自客户端的工作请求。工作(大小不同)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,每个队列都与一个ThreadPool相关联。ThreadPools的配置方式使引擎的整体性能达到最佳。 这种设计有助于我们有效地平衡请求的负载,大型请求不会占用系统资源。然而,当一些队列为空并且它们各自的线程池闲置时,该解决方案有时会变得

  • 在ThreadPoolExector#关闭的留档中,它说: 此方法不会等待以前提交的任务完成执行 那是什么意思? 因为我认为这意味着已经提交的排队任务可能无法完成,但事实并非如此;请参阅以下示例代码,该代码在启动所有提交的任务之前调用shutdown: 其中打印: 在这个例子中,很明显提交的任务是完全执行的。我在JDK8上用Oracle和IBMJDK运行了这个,得到了同样的结果。 那么文档中的这一

  • 我正在使用线程池执行器更改遗留设计。详情如下:- 遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。 新:-在新设计中,我将线程池替换为执行器服务 我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。 但我的问题是,这样做是否正确,因

  • 我使用线程池执行器,将其替换为旧版线程。 我创建了如下执行器: 这里的核心大小是maxpoolsize/5。我已经在应用程序启动时预先启动了所有核心线程,大约160个线程。 在传统设计中,我们创建并启动了大约670个线程。 但关键是,即使在使用Executor并创建和替换遗留设计之后,我们也不会得到更好的结果。 对于结果内存管理,我们使用Top命令来查看内存使用情况。对于时间,我们将System.