Надеюсь, я правильно понял. Вы хотите выполнять параллельные действия, ожидая их завершения.
Я только что прочитал в StackOverflow комментарий о следующем:
Потоки о параллелизме данных; Проблемы параллельных данных связаны с процессором, а не с IO. Похоже, что вы просто хотите одновременно выполнять несколько в основном не связанных с IO задач. Для этого используйте обычный старый пул потоков; Ваш первый пример - идеальный кандидат на ExecutorService.invokeAll ()
Может быть, ExecutorService
может помочь.
Я не знаю, как структурирован ваш код, но я могу предложить что-то вроде этого:
int processors = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(processors);
List<Callable<Boolean>> services = getURLToCheck().parallelStream()
.map(this::checkService)
.collect(Collectors.toList());
try {
List<Future<Boolean>> futures = executorService.invokeAll(services);
// do your validation with the concurrent tasks.
} catch (InterruptedException e) {
// Handle as you wish
}
Где также:
private List<URL> getURLToCheck() {
// Fetch your URL from wherever :)
}
private Callable<Boolean> checkService(URL url){
// Logic to check the service
}
Класс Future
имеет ключевые методы, которые могут быть вам полезны. Метод isDone()
и .get()
.
Первый указывает, завершено ли задание или нет, а второй будет ждать, пока оно завершит работу, сгенерировав все исключения, возникшие внутри, но обернутые в ExecutionException
. Может быть, вы можете объединить эти методы, чтобы сделать проверку. Быстро подумав, я представил себе цикл while, в котором вы спрашиваете, закончилось ли будущее, и если да, то получите результат проверки, и с этим прервите этот цикл, если false. Но мне это не нравится, ха-ха.
Надеюсь, я все прояснил. И также я надеюсь, что это может помочь. Если нет, я старался изо всех сил.