[英]Future waiting for FixedThreadPool is returning before all Threads finish
我试图等待所有线程完成后再使用Future执行另一个任务,但是出了点问题,因为我的future只是在等待for循环的最后一个线程。
我的执行者方法:
public static Future<?> downloadImages(Executor e, MainViewController controller, String filePath, String dns, int port, int numImg,
String offlineUuid, Map<String, String> cookies, String type, String outputFolder) throws SystemException, IOException, InterruptedException {
String urlImages;
String filePath2;
Future future = null;
if (numImg == 1) {
//Some Code
} else {
type = "multimages";
ExecutorService es = Executors.newFixedThreadPool(numImg);
for (int i = 0; i < numImg; i++) {
filePath2 = "";
filePath2 = filePath + File.separator + "TargetApp" + File.separator + "TempImage" + i + "Download.zip";
urlImages = "http://" + dns + ":" + port + Constants.TARGET_SERVICE_DOWNLOADIMAGES_PATH + offlineUuid + "/?pos=" + (i);
future = es.submit(new DownloaderAndUnzipTask(controller, urlImages, filePath2, outputFolder, cookies, type));
}
return future;
}
return null;
}
我的等待方法:
Future future = fullDownloadSelected(tableViewFull.getSelectionModel().getSelectedIndex());
if (future != null) {
try {
future.get();
if (future.isDone());
System.out.println("Processamento de Imagens Acabou");
} catch (ExecutionException ex) {
Logger.getLogger(MainViewController.class.getName()).log(Level.SEVERE, null, ex);
}
当在第一个方法中创建的最后一个线程完成时,将显示我的消息,但是当池中的所有线程完成时,它应该已经完成。 我认为在for循环中提交执行程序时出了点问题,但是我该如何解决呢?
您需要捕获返回的每个Future,然后等待每个完成(使用get on)
您也可以执行以下操作:
ExecutorService es = Executors.newFixedThreadPool(numImg);
List<Callable> tasks = ...
for (int i = 0; i < numImg; i++) {
tasks.add(your tasks);
}
List<Future<Object>> futures = es.invokeAll(tasks);
仅在其中所有任务完成后才返回。
您只是在等待最后的Future
完成。
future = es.submit(...);
...
return future;
...
// in waiting method, wait for the last job to finish
future.get();
这仅等待提交给executor-service的最后一个作业完成-其他作业仍可以运行。 您应该改为从downloadImages()
返回ExecutorService
。 然后在等待方法中执行以下操作:
// you must always shut the service down, no more jobs can be submitted
es.shutdown();
// waits for the service to complete forever
es.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
在调用方法中创建ExecutorService
并将其传递到downloadImages()
可能更有意义。
您将在每次迭代中重新分配未来。
您可以使用invokeAll ,当所有提交的任务完成时返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.