我想知道我将如何去做这件事。假设我加载了 1,000 个单词的列表,并为每个单词创建了一个线程,并说它对每个单词进行谷歌搜索。这里的问题很明显。我不能有 1k 个线程,可以吗。请记住,我对线程和同步非常陌生。所以基本上我想知道我将如何使用更少的线程。我假设我必须将线程数量设置为固定数量并同步线程。想知道如何使用 GetThread 使用 Apache HttpClient 执行此操作,然后运行它。在运行中,我从网页获取数据并将其转换为字符串,然后检查它是否包含某个单词。
2 回答
当然,您可以拥有任意数量的线程。但一般来说,不建议使用比计算机上的处理核心更多的线程。不要忘记一次创建 1000 个 Internet 会话会影响您的网络。一个谷歌页面的大小接近 0.3 兆字节。您真的要一次下载 300 兆字节的数据吗?
顺便一提,
关于并发有一个有趣的事情。有人说:“同步就像并发”。这不是真的。同步与并发相反。并发是当很多事情并行发生时。同步是我阻止你的时候。 (约书亚布洛赫)
也许你可以这样看待这个问题。
您有 1000 个单词,您将针对每个单词进行搜索。换句话说,有 1000 个任务要执行,并且它们彼此不相关,因此根据 Wiki 的以下定义,在此问题的情况下不需要同步。
“在计算机科学中,同步是指两个不同但相关的概念之一:进程同步和数据同步。进程同步是指多个进程在某个点连接或握手,以达到一个同意或承诺一定的行动顺序。数据同步是指保持数据集的多个副本彼此一致或保持数据完整性的想法。
因此,在这个问题中,您不必同步执行单词搜索的 1000 个进程,因为它们可以独立运行并且不需要联合起来。所以它不是进程同步。
这也不是数据同步,因为每次搜索的数据独立于其他 999 次搜索。
因此,当 Joshua 说同步是我阻止你的时候,在这种情况下不需要阻止。
是的,所有任务都可以在不同的线程中同时执行。当然,您的系统可能没有资源同时运行 1000 个线程(同时读取)。所以你需要像池这样的概念,其中一个池有一定数量的线程......比如说它有 10 个线程......那么这 10 个线程将开始对列表中的 10 个单词进行 10 次独立搜索。如果它们中的任何一个完成了它的任务,那么它将占用下一个可用的单词搜索任务,并且该过程继续......