我有一个服务器,它有多个使用java executorService实现的工作线程(即线程池)
我的问题是,我不能每秒记录一次,如果线程池中没有空闲线程可用,那么等待处理的作业的长度。
注意:日志记录不是我的问题,但我希望能够看到有多少任务/作业等待工作线程处理,是否仍然可以看到executor服务中等待队列(而不是线程池)的长度?
我不知道如何实现这个东西。
就像建议使用ThreadPoolExecatorService而不是ExecutorService一样,您可以利用ThreadPoolExecator类中存在的阻塞队列。这将为您提供等待的线程数。
此外,ThreadPoolExecitor类具有获取已提交任务和已执行任务的计数的方法。
请参考
线程池
封锁队列
希望这有帮助
如果您可以假设您的服务器使用的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()));
}
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.