Мне нужно получать данные из API, поэтому, естественно, у меня есть обработчик конечных точек, доступ к которому осуществляется через лямбда-выражение, которое, как я предполагаю, порождает несколько потоков для выполнения каждого вызова API, который мне нужен. Однако после завершения всех вызовов API (завершения всех лямбда-потоков) мне нужно упорядочить мои данные. В настоящее время используемый мной метод Sort выполняется в основном потоке и, следовательно, завершается до любого из вызовов API в конце лямбда-выражения. Вот образец того, что у меня есть
for(String data : dataArray) {
APIEndpoint apiCall = new APIEndpoint("http://sampleAPI.org/route/" + data);
apiCall.execute(((response, success) -> {
//Format and gather the info from the response
apiDataArray.add(DataFromAPIObject);
}));
}
System.out.print(apiDataArray.size());//Returns 0
sortData();//Currently Doesn't Sort anything because the array is empty
Обновлено: вот исполнитель конечной точки, с которым я работаю: https://github.com/orange-alliance/TOA-DataSync/blob/master/src/org/theorangealliance/datasync/util/FIRSTEndpoint.java
Возвращает ли метод APIEndpoint.execute что-нибудь, например Будущее? Если это не так, вы всегда можете использовать apiDataArray.add(index, DataFromAPIObject), где index определяется с помощью Collections.binarySearch.
Вам нужно создать Futures в вызове и дождаться их завершения вне цикла перед сортировкой.
Используйте интерфейс обратного вызова или семафор
Почему бы вам не использовать завершаемые фьючерсы, поскольку вам не нужно ждать никаких потоков. Они просто доделывают вещи за вас после завершения. Кроме того, хорошая практика для разделения вещей.




Возможно использование семафоров. Но он зайдет в тупик, если по какой-то причине не будет ответа хотя бы по одной из точек data. (Чтобы исправить тупик, вам может потребоваться освободить семафор при ошибках).
Semaphore semaphore = new Semaphore(dataArray.length);
for (String data : dataArray) {
semaphore.acquire();
APIEndpoint apiCall = new APIEndpoint("http://sampleAPI.org/route/" + data);
apiCall.execute(((response, success) -> {
// Format and gather the info from the response
apiDataArray.add(DataFromAPIObject);
semaphore.release();
}));
}
semaphore.acquire(dataArray.length);
sortData();
Это не сработало, семафор был получен, но после того, как семафор был получен, он не вошел в лямбду, и поэтому никогда не был выпущен
Вам необходимо зарегистрировать обработчик ошибок и освободить семафор при ошибках.
Почему бы вам не переместить вызов
sortData()в лямбда / обратный вызов?