Java中的同步多线程(Apache HTTPClient)

Java中的同步多线程(Apache HTTPClient),java,multithreading,apache,concurrency,synchronizing,Java,Multithreading,Apache,Concurrency,Synchronizing,我想知道我该怎么做。假设我加载了一个包含1000个单词的列表,每个单词都会创建一个线程,并在每个单词上进行谷歌搜索。这里的问题是显而易见的。我不能有1k线程,可以吗?请记住,我对线程和同步非常陌生。所以基本上我想知道我将如何使用更少的线程。我假设我必须将线程数量设置为固定数量并同步线程。我想知道如何使用GetThread在ApacheHttpClient上实现这一点,然后运行它。在运行中,我将从网页中获取数据,并将其转换为字符串,然后检查它是否包含某个单词。当然,您可以拥有任意数量的线程。但一般

我想知道我该怎么做。假设我加载了一个包含1000个单词的列表,每个单词都会创建一个线程,并在每个单词上进行谷歌搜索。这里的问题是显而易见的。我不能有1k线程,可以吗?请记住,我对线程和同步非常陌生。所以基本上我想知道我将如何使用更少的线程。我假设我必须将线程数量设置为固定数量并同步线程。我想知道如何使用GetThread在ApacheHttpClient上实现这一点,然后运行它。在运行中,我将从网页中获取数据,并将其转换为字符串,然后检查它是否包含某个单词。

当然,您可以拥有任意数量的线程。但一般来说,不建议使用超过计算机上处理内核数量的线程。 不要忘记,一次创建1000个internet会话会影响您的网络。一个谷歌页面的大小接近0.3兆字节。你真的要一次下载300兆字节的数据吗

顺便说一下

并发有一个有趣的地方。 有人说:“同步就像并发”。这不是真的。 同步与并发相反。 并发是指许多事情并行发生。 同步就是我阻止你的时候。 (约书亚·布洛赫)


也许你可以这样看待这个问题

你有1000个单词,每个单词你都要进行搜索。 换句话说,有1000个任务要执行,它们之间没有关联 因此,在这种情况下不需要同步 根据Wiki中的以下定义出现问题

在计算机科学中,同步是指两个不同但相关的概念之一:进程同步和数据同步。进程同步是指多个进程在某一点连接或握手,以达成协议或承诺某一动作序列。数据同步是指保持数据集的多个副本彼此一致,或保持数据完整性的想法。”

因此,在这个问题中,您不必同步1000个进程 执行单词搜索,因为它们可以独立运行,不需要 所以这不是一个进程同步

它也不是数据同步,因为每个搜索的数据都是同步的 独立于其他999搜索

因此,当Joshua说同步就是我阻止你的时候,在这种情况下没有必要阻止

是的,所有任务都可以在不同的线程中并发执行。 当然,您的系统可能没有运行1000个线程的资源 同时(同时读取)。 因此,您需要像池这样的概念,其中池没有特定的 线程…假设它有10个线程…那么这10个线程将启动 对列表中的10个单词进行10次独立搜索。 如果其中任何一个完成了任务,那么它将承担下一个任务
单词搜索任务可用,搜索过程仍在继续……

您可能有1000个线程,但这可能不是一个好主意。每个单词有一个线程几乎肯定不是一个好主意(如果有人给您100万个单词怎么办?1000万个怎么样?)改为了解线程池。请参阅ThreadPoolExecutor:虽然您可以有1000个线程,但您可能会因大量搜索而被google禁止(或被验证码阻止)好的,谢谢大家,是的,当我说我不能有1000个线程的时候,我的意思是这不是最好的主意,我一个字也不使用线程:PAh,当然,这就是我试图解决的问题,谷歌只是一个例子:P,谢谢tip@0x2B很高兴帮助你。告诉我你打算做什么?:)啊,有点尴尬我猜是的。我没有这个网站上的人那么好,所以我只是在做朋友们要求我做的随机练习和挑战。你几乎加载了一个用户名列表,它会检查网站上是否有用户名:)很抱歉回复太晚了