Правильная реализация многопоточности Java Future
В моем сервлете я бью несколько URLs, чтобы проверить их статус и вернуть ответ пользователю.
Выполнение многократных запросов занимает много времени: нужны потоки и тайм-ауты. Но мне нужны мои темы, чтобы получить ответ: используя Future по этой причине.
Моя схема кода:
ExecutorService executor = Executors.newFixedThreadPool(10);
Future future;
for (Map.Entry url : urls.entrySet())
{
try
{
future = executor.submit(new CallableRequestStatus(url.getValue()));
status = (statusModel) future.get(5, TimeUnit.SECONDS);
results.add(status);
}
catch (InterruptedException | ExecutionException | TimeoutException e)
{
System.out.println("Error: Timeout OR "+e.getMessage());
}
}
executor.shutdownNow();
Все результаты из моего вызываемого класса поступают в статусном объекте, который я позже добавляю к массиву. Моя проблема здесь в том, что мой подход не позволяет мне запускать все 10 потоков одновременно. Мне нужно подождать 5 секунд для получения объекта статуса, а затем перейти к следующему URL.
Я думаю, что мой подход неверен. Я пытался искать в Интернете, но не смог найти ни одного примера с пользовательскими объектами и включенным Arraylist.
Может кто-нибудь помочь мне исправить мою ошибку. заранее спасибо
Наконец обновил мой код (спасибо Сотириосу Делиманолису и Кевину):
ExecutorService executor = Executors.newFixedThreadPool(20);
List futures = new ArrayList();
for (Map.Entry url : urls.entrySet())
{
Future future = executor.submit(new CallableRequestStatus(url.getValue()));
futures.add(future);
}
ArrayList results = new ArrayList();
statusModel status;
int i=0;
for (Map.Entry url : urls.entrySet())
{
try
{
status = (statusModel) futures.get(i).get(500, TimeUnit.MILLISECONDS);
// do some stuff with status and
if(status.getStatusCode()/100 == 2)
results.add(status);
}
catch (InterruptedException | ExecutionException | TimeoutException e)
{
System.out.println("Error: Timeout OR "+e.getMessage());
}
i++;
}
executor.shutdownNow();
System.out.println("Shutdown: "+executor.isShutdown());
Надеюсь, это полезно для кого-то :)