【问题标题】:How to get the number of tasks in a queue in executor service?如何在执行器服务中获取队列中的任务数?
【发布时间】:2017-09-02 21:51:20
【问题描述】:

所以我正在使用 executorservice 创建一个线程池。

ExecutorService executor = Executors.newSingleThreadExecutor();

我正在尝试访问线程池队列中的任务数。我看到没有方法可以做到这一点。 我知道有一些方法可以在 threadpoolexecutor 中获取队列大小,但是如何使用 executorservice 对象来做到这一点。

就像我说的,如果我创建了这样的 ThreadpoolExecutor,我可以获得队列信息

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

我知道我可以使用 tpExecutor.queue.size() 来获取线程池队列中的任务数。 但目前我已经使用 Executor Service 声明了我的线程池。我怎样才能做到这一点? 如果人们可以编写代码并进行演示,那将是非常可观的。

【问题讨论】:

  • Executors.newFixedThreadPool(nThreads)nThreads =1?
  • 我会从中得到什么?如何获取线程池队列中的任务数?请详细说明。
  • 假设 newSingleThreadExecutor() 实际上返回了 ThreadPoolExector 的类型,您可以只转换对象并调用 docs.oracle.com/javase/8/docs/api/java/util/concurrent/… 不知道为什么这很重要。
  • @markspace 你的假设是错误的,看看我下面的评论。

标签: java multithreading executorservice threadpoolexecutor


【解决方案1】:

我认为这应该可行:

    ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) this.executorService;
    int activeCount = threadPoolExecutor.getActiveCount();
    long taskCount = threadPoolExecutor.getTaskCount();
    long completedTaskCount = threadPoolExecutor.getCompletedTaskCount();
    long tasksToDo = taskCount - completedTaskCount - activeCount;

由于某种原因,虽然它并不总是排除所有取消的任务,但只有在一些定期清理之后。所以我不得不介绍第二个计数器:

    long tasksToDo2 = threadPoolExecutor.getQueue().stream().filter(t -> !((FutureTask) t).isDone()).count();

【讨论】:

    【解决方案2】:

    您可以将其强制转换为 ThreadPoolExecutor。

    ThreadPoolExecutor ex=(ThreadPoolExecutor)executor; ex.getQueue().size();

    【讨论】:

    • 它不起作用,因为 Executors.newSingleThreadExecutor() 返回一个仅公开 ExecutorService 方法的委托执行器服务。我使用 Java 1.8。建议你看源码:fuseyism.com/classpath/doc/java/util/concurrent/…如果你真的想得到线程池执行器,你就得使用反射API,我没有找到聪明的解决方案。
    • 在像 Glassfish 这样的应用服务器中,托管的执行器服务实现了 ExecutorService 接口,但没有关于使用什么类的假设。
    • @gouessej 如果您使用newFixedThreadPool() 创建执行程序服务,此解决方案将起作用。如果只需要一个线程,为什么不调用newFixedThreadPool(1) 而不是newSingleThreadExecutor()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多