Мне нужно сделать длинное вычисление (проверьте состояние на удаленном сервере) списка элементов, а так как число элементов может быть большим (сначала от 1 до 100 000), я думал, что лучше всего разделить и нарезать их.Является ли эта реализация многопоточного длинного вычисления правильной?
Вот что я сделал:
// Retrieving list of items in the Database
Query<Platform> query = Ebean.createQuery(Platform.class, "WHERE disabled = false AND removed IS NULL");
query.order("created ASC");
Integer quantities = query.findRowCount();
int limit = (int) Math.ceil(quantities/10.0);
PagingList<Platform> list = query.findPagingList(limit); // This will return a list of 10 pages, containing (quantities/10) items
for (int i = 0; i < list.getPageSize(); i++) {
CheckState task = new CheckState(list.getPage(i).getList());
Thread worker = new Thread(task);
// Start the thread, never call method run() direct
worker.start();
}
А класс CheckState:
public class CheckState implements Runnable {
private List<Platform> platforms;
public CheckState(List<Platform> platforms) {
this.platforms = platforms;
}
@Override
public void run() {
// Do the verification for each platforms
for (Platform platform : platforms) {
platform.executeLongComputation()
}
}
}
Моя идея заключается в том, что это preferrable ограничить количество ниток, поэтому вместо того, разделив результат на страницах По 100 пунктов, я предпочитаю ограничивать количество страниц из n элементов внутри. Сделав это, я знаю, что для каждого вызова исходного метода всегда будет максимум 10 потоков (я могу изменить его в будущем более или менее, чтобы настроить настройки).
Но мне интересно, если это хорошая реализация, если это будет работать правильно. Скажем, например, что удаленный сервер не ответит, и у меня есть список из 1000 элементов внутри, не будет ли это причиной проблемы (за пределами дольше дольше)?
Спасибо за помощь мне :)
Рассмотрите возможность использования 'ExecutorService' вместо управления экземплярами' Thread'. –
Спасибо за ваше предложение, я применил его с помощью учебника от Vogela. Но, несмотря на чтение, я не понимаю, почему лучше использовать ExecutorService. У вас есть хорошие ссылки? –
Несомненно, просмотрите [это сообщение в блоге] (http://java.dzone.com/articles/java-concurrency-%E2%80%93-part-7). –