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

如何在单个Java Executor服务中识别管道中的所有任务何时完成

赵俊远
2023-03-14

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

Loader loader = Loader.getInstanceOf();
List<ExecutorService> services = new ArrayList<ExecutorService>();
ExecutorService es = Executors.newSingleThreadExecutor();

//Init Services
services.add(es);
services.add(task1.getService());
services.add(task2.getService());
services.add(task3.getService());
services.add(task4.getService());

//Start Loading Files
es.submit(loader);

int count = 0;
for (ExecutorService service : services)
{
    service.shutdown();
    count++;
    //Now wait for all submitted tasks to complete, for upto one day per task
    service.awaitTermination(10, TimeUnit.DAYS);
    MainWindow.logger.severe("Shutdown Task:" + count);
}

public class AnalyserService
{
    protected String threadGroup;
    public AnalyserService(String threadGroup)
    {
        this.threadGroup=threadGroup;
    }

    protected  ExecutorService      executorService;
    protected  CompletionService    completionService;

    protected void initExecutorService()
    {
        int workerSize = Runtime.getRuntime().availableProcessors();
        executorService
                = Executors.newFixedThreadPool(workerSize, new SongKongThreadFactory(threadGroup));
    }

    public ExecutorService getService()
    {
        if (executorService == null || executorService.isShutdown())
        {
            initExecutorService();
        }
        return executorService;
    }
}

所以这一切都很好,除了我的cpu加载逻辑不正确。每个服务都使用一个与计算机拥有的CPU数量相等的池。因此,如果计算机有4个CPU,我们有5个服务,那么我们可能有20个线程试图同时工作,使CPU超载。我想在这种情况下,我应该一次只有4个线程。

如果我限制每个服务使用一个线程,那么Id只有5个线程同时运行,但这仍然是正确的,因为

    null

共有1个答案

全誉
2023-03-14

问题的核心是:“[...]CPU过载。”如果这是问题所在,只需正确调度应用程序的优先级即可。顺便说一下,您更有可能增加IO负载,而不是增加CPU负载;很多不同的线程实际上是一件好事:-)

但是,您的问题是:“但是,我将如何识别服务何时完成?”非常简单的答案是:submit()而不是invokeAll()并检查您接收的future对象的isdone()方法。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/executorservice.html#submit(java.util.concurrent.callable)

 类似资料:
  • 问题内容: 等待所有任务完成的最简单方法是什么?我的任务主要是计算,所以我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示: 实现可运行。这似乎是正确执行的任务,但代码崩溃上用。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。 包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西 问题答案: 最简单的方法是使用单行代码执行所需的操作。用你的话来说,你需要修改或包装以实

  • 本文向大家介绍如何在PHP中识别服务器IP地址?,包括了如何在PHP中识别服务器IP地址?的使用技巧和注意事项,需要的朋友参考一下 可以使用以下代码行标识服务器IP- 可以使用下面的代码行来标识端口- 对于5.3和更高版本的PHP,可以使用以下代码行- 当运行独立脚本(未通过Web服务器运行)时,可以使用此功能。

  • 问题内容: 如何识别PHP中的服务器IP地址? 问题答案: 像这样的服务器IP: 这是港口

  • 问题内容: 我有一个场景,我将必须对服务器进行六个http调用才能获取六个不同项目的数据。这些服务器调用不能合并,并且它们就是那样。例如:如果您需要GOOGLE的报价信息,则向服务器发送请求,以请求google的报价信息。接下来,如果您需要Yahoo,则可以发起另一个http调用,依此类推。 情况如下: 现在,我的最终用户想要比较6家不同的公司。 正如我提到的那样,我不可避免地要使用6个异步任务进

  • 我的问题可能听起来很奇怪,但请耐心听我说。这就是我所拥有的: 表产品: 如何从中删除真正的重复项?如果您查看数据,您可以看到Pen C有三行数据完全相同。笔A有两行数据相同,一行成本不同。我不想取消“钢笔A”。 下面是一个简单的group by语句: 这不起作用,因为它也会拿起“钢笔A”。 感谢您的帮助。非常感谢。

  • 我如何在Android Studio中打开一个视图,其中显示我使用注释创建的所有任务?