我必须从API获取数据,所以自然地,我有一个通过lambda访问的终结点处理程序,我假设它产生了多个线程来完成我需要的每个API调用。但是,在所有API调用完成(所有lambda线程完成)之后,我需要整理数据。目前,我已经在主线程上运行了Sort方法,因此在lambda中的任何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
答案 0 :(得分:0)
可以使用信号量。但是,如果由于某种原因,至少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();