我有一个要在文件上完成的任务管道,每种不同类型的任务在不同的执行器服务中运行。在初始化每个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个线程同时运行,但这仍然是正确的,因为
问题的核心是:“[...]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中打开一个视图,其中显示我使用注释创建的所有任务?