Синхронная многопоточность в Java (Apache HTTPClient)

Мне интересно, как я буду делать это. Скажем, я загружаю список из 1000 слов, и для каждого слова создается ветка, и говорю, что он выполняет поиск в Google по каждому слову. Проблема здесь очевидна. Я не могу иметь 1k потоков, могу я. Имейте в виду, я чрезвычайно плохо знаком с потоками и синхронизацией. В общем, мне интересно, как бы я использовал меньше потоков. Я предполагаю, что я должен установить количество потоков на фиксированное число и синхронизировать потоки. Было интересно, как сделать это с Apache HttpClient с помощью GetThread, а затем запустить его. В процессе я получаю данные с веб-страницы и превращаю их в строку, а затем проверяю, содержит ли оно определенное слово.

2 ответа

Решение

Может быть, вы можете посмотреть на эту проблему таким образом.

У вас есть 1000 слов, и для каждого слова вы собираетесь провести поиск. Другими словами, нужно выполнить 1000 задач, и они не связаны друг с другом, поэтому нет необходимости в синхронизации в случае этой проблемы согласно следующему определению из Wiki.

"В информатике синхронизация относится к одному из двух различных, но взаимосвязанных понятий: синхронизация процессов и синхронизация данных. Синхронизация процессов относится к идее, что несколько процессов должны объединиться или рукопожатие в определенной точке, чтобы достичь согласие или принятие определенной последовательности действий. Синхронизация данных относится к идее обеспечения согласованности друг с другом нескольких копий набора данных или сохранения целостности данных ".

Таким образом, в этой задаче вам не нужно синхронизировать 1000 процессов, которые выполняют поиск слов, поскольку они могут выполняться независимо и не должны объединять усилия. Так что это не синхронизация процессов.

Это также не синхронизация данных, поскольку данные каждого поиска не зависят от других 999 поисков.

Следовательно, когда Джошуа говорит, что Синхронизация - это когда я блокирую вас, в этом случае нет необходимости блокировать.

Да, все задачи могут выполняться одновременно в разных потоках. Конечно, ваша система может не иметь ресурсов для одновременного запуска 1000 потоков (читайте одновременно). Таким образом, вам нужны такие понятия, как пулы, в которых пул имеет определенное количество потоков... скажем, если у него 10 потоков... тогда эти 10 начнут 10 независимых поисков по 10 словам из вашего списка. Если какой-либо из них будет выполнен с его задачей, то он займется следующей доступной задачей поиска слова, и процесс продолжится....

Конечно, вы можете иметь столько потоков, сколько хотите. Но в целом не рекомендуется использовать больше потоков, чем имеется на вашем компьютере. И не забывайте, что создание 1000 интернет-сессий одновременно влияет на вашу сеть. Размер одной страницы Google составляет почти 0,3 мегабайта. Вы действительно собираетесь загружать 300 мегабайт данных одновременно?

Кстати,

В параллельности есть одна забавная вещь. Некоторые люди говорят: "Синхронизация - это как параллелизм". Это не правда. Синхронизация противоположна параллелизму. Параллельность - это когда много вещей происходит параллельно. Синхронизация - это когда я блокирую тебя. (Джошуа Блох)

Другие вопросы по тегам