Метод отправки ExecutorService вернул фьючерсы, не поддерживающие порядок отправки - PullRequest
1 голос
/ 20 сентября 2019

Привет всем, я довольно новичок во всех вещах java-параллелизма, так что извините, если мой вопрос звучит немного наивно.Дело в том, что я пытаюсь отправить задачи в службу исполнителя в цикле и немедленно возвращаю будущее, возвращенное в списке.Теперь в другом цикле я перебираю список фьючерсов и вызываю get на будущее, чтобы получить реальный результат.Что меня беспокоит, так это то, что я ожидаю, что будущее будет в том же порядке, что и отправка, но я получаю совершенно случайный порядок. Вот мой код

for (int count = 0; count < product_ID_List.size(); count++) {
                System.out.println(product_ID_List.get(count));
                WebServiceCall WebServiceCall = new WebServiceCall(basePath, product_ID_List.get(count),
                        companyId);
                futureList.add(executor.submit(WebServiceCall));
            }

, вызов веб-службы в основном вставляет запись в базу данных.и возвращает автоматически сгенерированный идентификатор

И вот код для итерации по будущему. List

for (int count = 0; count < futureList.size(); count++) {
                Response resp = futureList.get(count).get();
                BResponse bresponse = new BResponse();
                bresponse = resp.readEntity(BResponse.class);
                System.out.println("the generated id is @ " + bresponse.generatedPOID);

            }

Теперь в совершенно новой таблице я обычно ожидаю, что результат будет 1,2,3поскольку первая отправленная задача генерирует идентификатор 1 и т. д., но результат, который я получаю, является случайным, например 3,1,2, 2,3,1 и т. д. Нужна помощь в том, как получить фьючерсы, поддерживаемые вПорядок выполнения задания был представлен. Отметим, что речь не идет о порядке выполнения задания.

1 Ответ

2 голосов
/ 20 сентября 2019

Здесь ваш фьючерс не меняет своего порядка.Вы получаете future.get() в том же порядке, в котором вы отправили задание.Однако вы видели, что порядок идентификаторов не является последовательным, так как задача , которую вы отправили первой, действительно гарантирует, что она будет выполнена первой .Таким образом, возможно, что отправленная вами первая задача может быть выполнена последней (или любой последовательностью), поэтому может быть n количество задач, уже выполненных до этого, поэтому, когда эта задача выполняется, она получит идентификатор (n+1)вместо 1 и future.get() вернет вам (n+1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...