2013-09-25 5 views
0

У меня есть метод, который берет строку как входную информацию и возвращает данные из БД на основе входной строки. У меня есть массив строк, и я в настоящее время проходит каждую строку в качестве входных данных и цикл по всему массивуКак читать данные одновременно с помощью java?

public DataClass getData(String input){ 
    ....logic to get the data when string=input from a third party API. 
     Third party API takes 'input' string and gives out data.... 
} 

public void callerMethod() { 
    List<String> myStrings = new List<String>(); 
    for(inputStr : myStrings) { 
     DataClass data = getData(inputStr); 
    } 
} 

Выше кода логики у меня есть на данный момент. Я хочу изменить вызовы метода getData() на одновременные вызовы, а не перебирать список один за другим, поскольку этот подход занимает время. Я не уверен, могу ли я использовать потоки здесь или если есть какой-либо более новый подход для достижения этого.

+3

Если вы читаете из БД, я могу гарантировать, что вы привязаны к IO. Параллелизация IO по одному каналу не поможет. Вы должны переместить логику фильтрации в запрос БД. – millimoose

+1

Хотя в текущем случае у меня есть другие области, подобные этому с DB IO, я делаю вызов API для стороннего API. Редактирование вопроса для включения этой информации – user811433

+0

@millimoose Можете ли вы? Существует множество случаев, когда вы можете выполнять действие с привязкой к процессору на основе строки или выполнять другие связанные с IO задачи. –

ответ

2

Это может быть распараллелировано с использованием инфраструктуры Executor. Создайте ThreadPoolExecutor. Количество потоков должно быть, вероятно, равным количеству одновременных подключений, которые вы можете иметь к базе данных (т. Е. Размер пула подключений).

Петля через ваши строки. Для каждой строки создайте Callable, которая обертывает getData и отправляет вызываемый исполнителю. Исполнитель вернет Будущее, которое вы можете использовать позже. После того, как вы представили все вызовы, вы можете начать извлечение DataClasses из своих фьючерсов.

+0

Один вопрос - future.get() не возвращает мне никаких данных. Должен ли он возвращать ценности? – user811433

+0

@ user811433, future.get() вернет то же самое, что и callable.call(). Разница в том, что если вы вызываете call() самостоятельно, он будет выполняться немедленно. Однако, если вы отправляете вызываемый исполнителю, то он может быть вызван в будущем.Будущее позволяет получить значение отложенного вызова. Если значение еще не доступно, оно будет блокироваться до тех пор, пока оно не будет. –

Смежные вопросы