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