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

如何在executor服务中获取队列中的任务数?

邵阳德
2023-03-14

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

ExecutorService executor = Executors.newSingleThreadExecutor();

我试图访问线程池队列中的任务数。我看到没有办法得到它。我知道有一些方法来获取线程池执行器中的队列大小,但是我如何使用执行器服务对象来实现这一点。

就像我说的,如果我创建了一个像这样的线程池执行器,我可以得到队列信息

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

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

共有2个答案

崔宇
2023-03-14

您可以将此强制转换为ThreadPoolExec导师。

ThreadPoolExecutor ex=(ThreadPoolExecutor)executor;例如getQueue()。大小();

蔡鸿骞
2023-03-14

我认为这应该奏效:

    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();
 类似资料:
  • 问题内容: 我已经使用JavaFX制作了GUI,并且有三个单选按钮,一旦用户单击“提交”并创建了另一个线程,并且根据检查的单选按钮,该线程将运行所需的输出并将结果输出到控制台。 但是,当线程正在运行时(一个过程大约需要30秒才能完成),我可以检查任何单选按钮。为此,它创建另一个线程,并与其他正在进行的线程长时间输出。所以我的输出盒简直是一团糟!我正在查看 异步 任务,但不确定是否与此相关。 这是我

  • 如何获取Azure服务总线队列中死信消息的数量? 我可以像这样得到队列中的计数。。。 但这看起来既包括队列中的消息,也包括关联死信队列中的消息 我如何区分它们?

  • 我有一个要在文件上完成的任务管道,每种不同类型的任务在不同的执行器服务中运行。在初始化每个executor服务之后,我启动第一个任务,在完成处理所有文件之前,这个任务保证不会完成,因为它处理一个文件夹不需要更多的工作,或者它向Service2提交一个可调用的任务。因此,当第一个任务的shutdown()调用是必要的时,所有文件都将在task2或pipleline下的另一个任务中处理,依此类推。当我

  • 我在玩java多线程代码。我创建了一个具有固定线程池的executor服务。我正在提交两个任务顺序。我试图用线程使第一个任务变得很长。我在想这两个任务将并行运行。然而,当我运行程序时,程序会等待一段时间,然后输出一个B,这意味着编译器首先完成了第一个任务,然后才执行第二个任务。事实上,我在期待,因为第二个任务是一个短任务,它会在第一个任务之前完成。有什么解释吗?

  • 我有一个应用程序,在这个应用程序中,我可以在进程的一部分中以JSON格式将消息写入Azure服务总线队列。我有一个下游进程,我想将该消息从队列中弹出,将json转换为一个对象,然后处理该对象。 我没有问题将消息推送到队列上,但我还没有找到任何将消息从队列中逐一或循环弹出的示例。我在微软或Github上看到的每一个例子都是一个控制台应用程序(在网络应用程序中毫无用处),它设置了某种侦听器,可以抓取队

  • 我想了解在fork-连接池中处理任务Java顺序。 到目前为止,我在文档中找到的唯一相关信息是关于一个名为“asyncMode”的参数,该参数“如果此池对从未加入的分叉任务使用本地先进先出调度模式,则为真”。 我对这句话的解释是,每个工人都有自己的任务队列;工人从他们自己队列的前面接受任务,或者如果他们自己的队列是空的,从其他工人队列的后面偷走任务;如果asyncMode为真(分别为假),工作人员