Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行器仍在运行时完成的任务数_Java_Multithreading_Executorservice_Executor - Fatal编程技术网

Java 执行器仍在运行时完成的任务数

Java 执行器仍在运行时完成的任务数,java,multithreading,executorservice,executor,Java,Multithreading,Executorservice,Executor,有没有办法找到调用invokeAll()后完成的任务数?当所有线程都完成时,它似乎返回已完成任务的布尔值列表 我有一个1000个任务的池,并希望在100个时间间隔内查看它们,而不必将它们划分为100个任务批次 出于兼容性的原因,我还必须使用Java6,所以更新的方法不会有帮助 另外,作为一个附带问题:invokeAll()是否以FIFO方式处理任务?也就是说,任务是否按照添加到任务列表的顺序开始 谢谢 我有一个1000个任务的池,并希望在100个时间间隔内查看它们,而不必将它们划分为100个任务

有没有办法找到调用invokeAll()后完成的任务数?当所有线程都完成时,它似乎返回已完成任务的布尔值列表

我有一个1000个任务的池,并希望在100个时间间隔内查看它们,而不必将它们划分为100个任务批次

出于兼容性的原因,我还必须使用Java6,所以更新的方法不会有帮助

另外,作为一个附带问题:invokeAll()是否以FIFO方式处理任务?也就是说,任务是否按照添加到任务列表的顺序开始

谢谢

我有一个1000个任务的池,并希望在100个时间间隔内查看它们,而不必将它们划分为100个任务批次

您应该考虑使用一个允许您在一个作业完成后得到通知,而不是必须等待使用<代码>调用()/<代码>完成所有作业。然后,您可以将每个完成的作业放入一个集合中,然后在得到100个作业时对其执行操作

可能是这样的:

CompletionService<Result> ecs = new ExecutorCompletionService<Result>(executor);
for (Callable<Result> s : solvers)
    ecs.submit(s);
int n = solvers.size();
List<Result> batch = new ArrayList<Result>();
for (int i = 0; i < n; ++i) {
    Result r = ecs.take().get();
    batch.add(r);
    if (batch.size() >= 100) {
       process(batch);
       batch.clear();
    }
}
if (!batch.isEmpty()) {
    process(batch);
}
CompletionService ecs=新的执行者CompletionService(执行者);
for(可调用的s:解算器)
ecs.提交;
int n=solvers.size();
列表批处理=新建ArrayList();
对于(int i=0;i=100){
工艺(批次);
batch.clear();
}
}
如果(!batch.isEmpty()){
工艺(批次);
}
invokeAll()是否以FIFO方式处理任务?也就是说,任务是否按照添加到任务列表的顺序开始

任务以FIFO方式提交到线程池,并且线程也以FIFO顺序退出队列。但是,一旦每个线程都有一个作业,就会出现争用条件,这可能会导致对实际任务“开始”和“完成”重新排序

我有一个1000个任务的池,并希望在100个时间间隔内查看它们,而不必将它们划分为100个任务批次

您应该考虑使用一个允许您在一个作业完成后得到通知,而不是必须等待使用<代码>调用()/<代码>完成所有作业。然后,您可以将每个完成的作业放入一个集合中,然后在得到100个作业时对其执行操作

可能是这样的:

CompletionService<Result> ecs = new ExecutorCompletionService<Result>(executor);
for (Callable<Result> s : solvers)
    ecs.submit(s);
int n = solvers.size();
List<Result> batch = new ArrayList<Result>();
for (int i = 0; i < n; ++i) {
    Result r = ecs.take().get();
    batch.add(r);
    if (batch.size() >= 100) {
       process(batch);
       batch.clear();
    }
}
if (!batch.isEmpty()) {
    process(batch);
}
CompletionService ecs=新的执行者CompletionService(执行者);
for(可调用的s:解算器)
ecs.提交;
int n=solvers.size();
列表批处理=新建ArrayList();
对于(int i=0;i=100){
工艺(批次);
batch.clear();
}
}
如果(!batch.isEmpty()){
工艺(批次);
}
invokeAll()是否以FIFO方式处理任务?也就是说,任务是否按照添加到任务列表的顺序开始


任务以FIFO方式提交到线程池,并且线程也以FIFO顺序退出队列。但是,一旦每个线程都有一个作业,就会出现争用条件,这可能会导致对实际任务“开始”和“肯定完成”重新排序。

任务将按指定的顺序添加,如果有多个线程,则大致按该顺序开始。如果它们花费相同的时间,它们完成的顺序将大致相同


我将建立一个
列表
,您可以定期轮询以查看完成了多少任务。

任务将按照您指定的顺序添加,如果您有多个线程,则大致按照该顺序开始。如果它们花费相同的时间,它们完成的顺序将大致相同


我会建立一个
列表
,你可以定期轮询,看看完成了多少。

谢谢。我有两种类型的任务A和B。我想知道所有类型A和类型B的任务何时完成。类型A和B在结构上是相同的,但是类型A使用的数据更大,这就是为什么需要更长的时间。我认为在任务类中定义以下变量会很好:1)final static int NTYPEATOComplete;2) 已完成的静态整型任务;3) 静态完成时间长;对于类型B也是一样。然后,在call()的末尾,我添加了一个数组,并检查是否=100。如果是,我会记录完成时间。可以吗?另外#workers=nCPU-1,因为任务繁重。谢谢。我有两种类型的任务A和B。我想知道所有类型A和类型B的任务何时完成。类型A和B在结构上是相同的,但是类型A使用的数据更大,这就是为什么需要更长的时间。我认为在任务类中定义以下变量会很好:1)final static int NTYPEATOComplete;2) 已完成的静态整型任务;3) 静态完成时间长;对于类型B也是一样。然后,在call()的末尾,我添加了一个数组,并检查是否=100。如果是,我会记录完成时间。可以吗?此外,由于任务繁重,工人=nCPU-1。