我的代码就像:
someFunction() {
// countdownlatch is set up here
for (i = 0; i<cyclesCount; i++) {
//request is sending
someServerRequest.executeWithListener(new CustomListener() {
@Override
public void onComplete(Integer response) {
arraylist.add(response);
}
});
}
//countdownlatch waits here
//do something with arraylist
}
CountDownLatch有助于等待循环,但其中的每个服务器请求都是在单独的线程中完成的。所以我得到随机顺序的回复,这不适合我。
我尝试以不同的方式使用Phaser和CountDownLatch,但它对我不起作用。
答案 0 :(得分:0)
您可以(例如)创建一个Result
类,并将 的实例添加到ArrayList
。例如:
private static class Result {
private final int resultNumber;
private final Integer response;
private Result(final int resultNumber, final Integer response) {
this.resultNumber = resultNumber;
this.response = response;
}
}
然后
for (i = 0; i < cyclesCount; i++) {
someServerRequest.executeWithListener(new CustomListener() {
@Override
public void onComplete(Integer response) {
arrayList.add(new Result(i, response));
}
});
}
然后,您可以根据resultNumber
对列表进行排序(如果需要,可以将其映射到responses
列表),或者制作Result implements Comparable<Result>
然后使用自然从那里排序。
此外:ArrayList
不是线程安全的(只是通过变量的名称)。如果您在实际生产代码中使用此功能,我建议Collections.synchronizedList(new ArrayList<>())
。