2013-10-11 4 views
0

Мне нужно сделать длинное вычисление (проверьте состояние на удаленном сервере) списка элементов, а так как число элементов может быть большим (сначала от 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 элементов внутри, не будет ли это причиной проблемы (за пределами дольше дольше)?

Спасибо за помощь мне :)

+1

Рассмотрите возможность использования 'ExecutorService' вместо управления экземплярами' Thread'. –

+0

Спасибо за ваше предложение, я применил его с помощью учебника от Vogela. Но, несмотря на чтение, я не понимаю, почему лучше использовать ExecutorService. У вас есть хорошие ссылки? –

+0

Несомненно, просмотрите [это сообщение в блоге] (http://java.dzone.com/articles/java-concurrency-%E2%80%93-part-7). –

ответ

1

Вы не должны управлять Thread экземпляров самостоятельно. Java уже предоставляет способ выполнения асинхронных задач в виде ExecutorService. Если вы хотите запустить пул и повторно использовать Thread s, когда они снова станут доступны, используйте ExecutorService с бассейном Thread. Вы можете получить его с Executors.newFixedThreadPool(int). Существует ряд других методов производства, которые могут вас заинтересовать.

Имейте в виду, что много потоков означает много переключения контекста. Проверьте свою среду на лучшую конфигурацию.

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