Java - дождитесь окончания Lambda, прежде чем продолжить - PullRequest
0 голосов
/ 04 ноября 2018

Мне нужно получить данные из 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

Edit: вот Конечный исполнитель, с которым я работаю: https://github.com/orange-alliance/TOA-DataSync/blob/master/src/org/theorangealliance/datasync/util/FIRSTEndpoint.java

1 Ответ

0 голосов
/ 04 ноября 2018

Возможно использование семафоров. Но он заходит в тупик, если по какой-то причине нет ответа хотя бы на один из 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...