Просто, чтобы начать, обратитесь к этому другому вопросу SO
и обратите внимание на пункт # 1 в самом вопросе.
Чтобы выполнить асинхронные вызовы, сначала необходимо отделить - отправку / выполнение задачи (выбрать элемент из очереди и выполнить вызов API) и обработку ответа после вызова API (удалить элемент из очереди, если статус ответа равен 200).Эта развязка может быть достигнута с помощью - ExecutorService
Итак, сначала введите ExecutorService
в ваш код Runnable
, т.е. начните выполнение Runnable
с некоторого класса контроллера (класса с методом main), которыйиспользует Executor
для отправки / выполнения запросов.Вы не показали, как вы запускаете свою тему, так что вы, возможно, уже делаете это.
Теперь измените ваш Runnable
на Callable<Response>
, то есть создайте Callable, похожий на ваш Runnable и реализуйте Callable<Response>
, а в методе call()
сделайте вызов API.Вам необходимо предоставить ваш ObjectQueue<JSONObject>
вашему классу основного контроллера и этому Callable, чтобы реализация очереди была поточно-ориентированной, или вам нужно сделать метод call()
поточно-ориентированным.
Я имею в виду, что вы либо зацикливаетесь на своей очереди в контроллере и продолжаете отправлять запросы на каждый элемент, либо передаете всю очередь в Callble, и там выполняется блокировка - это ваш вызов.
Обратите внимание, что до этой точки метод call()
возвращает значение - Может вызываться , в то время как run()
метод Runnable
не возвращает никакого значения, и это является существенным отличиеммежду двумя.
Теперь вернемся к классу контроллера - метод submit или execute превратит ваш Response
в Future
submit
Теперь используйте комбинацию isDone()
&get()
методы в вашем Future для удаления элемента из очереди.
Помните, что вы должны иметь возможность идентифицировать обработанный объект в очереди из ответа API - если нет, то вам нужно объединить ответ API с отправленным JSONObject
и обернуть его в Future
, чтобы выяснить, какой объект нужноудалить к.Только статуса недостаточно, и вам может понадобиться другая структура данных для хранения объектов, если очередь ограничена для удаления только верхнего элемента.Эта сложность не возникает, если вы просто заменяете runnable на callable, но не хотите делать вашу программу действительно асинхронной.
Это просто общие рекомендации, и я не буду делать готовый код.Вы найдете много примеров в Интернете, если ваши основы верны.Кроме того, при вставке кода обязательно попробуйте включить import
операторов.
Несколько ссылок
Как отправлять параллельные запросы GET и ждать результатов ответов?
Как отправлять несколько асинхронных запросов в разные сетиуслуги