如何在循环服务器请求中使用Phaser?

时间:2018-02-28 21:20:48

标签: java android multithreading

我的代码就像:

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,但它对我不起作用。

1 个答案:

答案 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<>())