Я хочу использовать CompletionService для обработки результатов из ряда потоков по мере их завершения . У меня есть служба в цикле для получения объектов Future, которые она предоставляет, когда они становятся доступными, но я не знаю лучшего способа определить, когда все потоки завершены (и, таким образом, выйти из цикла):
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
public class Bar {
final static int MAX_THREADS = 4;
final static int TOTAL_THREADS = 20;
public static void main(String[] args) throws Exception{
final ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(MAX_THREADS);
final CompletionService<Integer> service = new ExecutorCompletionService<Integer>(threadPool);
for (int i=0; i<TOTAL_THREADS; i++){
service.submit(new MyCallable(i));
}
int finished = 0;
Future<Integer> future = null;
do{
future = service.take();
int result = future.get();
System.out.println(" took: " + result);
finished++;
}while(finished < TOTAL_THREADS);
System.out.println("Shutting down");
threadPool.shutdown();
}
public static class MyCallable implements Callable<Integer>{
final int id;
public MyCallable(int id){
this.id = id;
System.out.println("Submitting: " + id);
}
@Override
public Integer call() throws Exception {
Thread.sleep(1000);
System.out.println("finished: " + id);
return id;
}
}
}
Я пытался проверить состояние ThreadPoolExecutor, но я знаю, что методы getCompletedTaskCount и getTaskCount являются лишь приблизительными и на них нельзя полагаться. Есть ли лучший способ убедиться, что я получил все фьючерсы из CompletionService, чем сам их подсчитывать?
Редактировать: и ссылка, предоставленная Nobeh, и эта ссылка предполагают, что подсчет количества отправленных задач, а затем многократный вызов метода take () - это путь. Я просто удивлен, что нет способа спросить CompletionService или его исполнителя, что осталось вернуть.