Мне интересно, как я буду заниматься этим. Скажем, я загружаю список из 1000 слов, и для каждого слова создается поток и говорят, что он выполняет поиск по каждому слову. Проблема здесь очевидна. У меня не может быть 1k потоков, я могу. Имейте в виду, что я чрезвычайно новичок в потоках и синхронизации. Поэтому в основном мне интересно, как я буду использовать меньше потоков. Я предполагаю, что мне нужно установить количество потоков на фиксированное число и синхронизировать потоки. Интересно, как это сделать с Apache HttpClient с помощью GetThread, а затем запустить его. Во время выполнения я получаю данные с веб-страницы и превращаю ее в строку, а затем проверяю, содержит ли она определенное слово.Синхронная многопоточность в Java (Apache HTTPClient)
ответ
Может быть, вы можете взглянуть на эту проблему таким образом.
У вас есть 1000 слов и для каждого слова, которое вы собираетесь выполнить. Другими словами, необходимо выполнить 1000 заданий, и они не связаны между собой , поэтому нет необходимости в синхронизации в случае этой проблемы в соответствии со следующим определением из Wiki.
«В информатике синхронизация относится к одной из двух различных, но взаимосвязанных концепций: синхронизации процессов и синхронизации данных. Синхронизация процессов относится к идее о том, что несколько процессов должны объединяться или квитироваться в определенной точке, в Синхронизация данных относится к идее сохранения нескольких копий набора данных в согласованности друг с другом или для сохранения целостности данных »
Так что в этой задаче вы не выполняете должны синхронизировать 1000 процессов, которые выполняют поиск слов, так как они могут работать независимо и не нуждаются в , чтобы объединить усилия. Таким образом, это не синхронизация процесса.
Это не синхронизация данных, так как данные каждого поиска не зависят от других 999 запросов.
Следовательно, когда Джошуа говорит, что синхронизация - это когда я блокирую вас, в этом случае нет необходимости блокировать.
Да все задачи могут одновременно выполняться в разных потоках. Разумеется, ваша система может не иметь ресурсов для запуска 1000 потоков одновременно (читается в то же время). Итак, вам нужны такие понятия, как пулы, где у пула есть определенное количество потоков ... скажем, если у него 10 потоков ... тогда эти 10 начнут 10 независимых поисков по 10 словам из вашего списка. Если какая-либо из них выполнена с ее задачей, тогда будет занята следующая задача поиска слов , и процесс продолжается.
Ahh большое спасибо, я понимаю это сейчас :) – 0x2B
У вас может быть столько потоков, сколько вы хотите. Но в целом не рекомендуется использовать больше потоков, чем на вашем компьютере. И не забывайте, что создание 1000 интернет-сессий сразу влияет на вашу сеть. Размер одной страницы google составляет около 0,3 мегабайта. Вы действительно собираетесь загрузить сразу 300 мегабайт данных?
Кстати,
Существует забавная вещь о параллельности. Некоторые люди говорят: «Синхронизация подобна параллелизму». Это не верно. Синхронизация - это противоположность параллелизма. Параллелизм - это когда происходит много вещей параллельно. Синхронизация - это когда я блокирую вас. (Joshua Bloch)
А, конечно, это то, что я пытаюсь исправить, и Google был всего лишь примером: P и спасибо за отзыв – 0x2B
@ 0x2B рад помочь вам. Расскажите о том, что вы собираетесь делать? :) –
А это своего рода неловко, я думаю. Я не так хорош, как люди на этом сайте, поэтому я просто делаю случайные вещи, которые мои друзья просят меня сделать для практики и борьбы. В значительной степени вы загружаете список имен пользователей, и он проверяет, доступно ли имя пользователя на веб-сайте :) Извините за поздний ответ – 0x2B
Возможно, у вас есть 101 поток, но это, вероятно, не очень хорошая идея. Имея один поток за каждое слово - почти наверняка - это не очень хорошая идея (что, если кто-то даст вам миллион слов? Что насчет десяти миллионов?) Узнайте об _thread pool_ вместо этого. http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html –
См. ThreadPoolExecutor: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor .html –
, в то время как у вас может быть 1000 потоков, вы, вероятно, будете запрещены google для поиска больших объемов (или остановите их по капчу) – ZhongYu