2015-05-11 79 views
1

我想知道如何去做这件事。假设我加载了一个1000字的列表,并为每个字创建了一个线索,并说它对每个字都进行了谷歌搜索。这里的问题很明显。我不能有1k线程,我可以。请记住,我对线程和同步非常陌生。所以基本上我想知道如何去使用更少的线程。我假设我必须将线程数量设置为一个固定的数字并同步这些线程。想知道如何使用GetThread与Apache HttpClient做到这一点,然后运行它。在运行中,我从网页获取数据并将其转换为字符串,然后检查它是否包含某个单词。Java中的同步多线程(Apache HTTPClient)

+0

您可能_can_有1000个线程,但它可能不是一个好主意。每个单词有一个线程肯定不会是一个好主意(如果有人给你一百万字,那么大概有一千万字呢?)了解_thread pools_而不是。 http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html –

+0

请参阅ThreadPoolExecutor:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor .html –

+0

虽然你可以有1000线程,你可能会被谷歌禁止大量搜索(或由captcha停止) – ZhongYu

回答

1

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

你有1000个单词,每个单词你要进行搜索。 换句话说,有1000个任务需要执行,并且它们不会相互关联 ,因此根据Wiki的以下定义,在此问题的情况下不需要同步。 “在计算机科学中,同步指的是两个截然不同但相关的概念之一:进程的同步和数据的同步。进程同步指的是多个进程在特定点加入或握手的想法,数据同步是指保持数据集的多个副本彼此一致或保持数据完整性的想法“

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

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

因此,当约书亚说同步是当我阻止你时,在这种情况下不需要阻塞。

是的所有任务都可以在不同的线程中同时执行。 当然,您的系统可能没有资源同时运行1000个线程 (同时读取)。 因此,您需要像池这样的概念,池中有一定数量的 线程......说出它是否有10个线程...然后这10个将开始 对您列表中10个单词的10个独立搜索。 如果他们中的任何一个都完成了它的任务,那么它将占用下一个 可用的单词搜索任务,并且过程继续......

+0

啊非常感谢你,我现在明白了:) – 0x2B

2

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

顺便说一句,

有关于并发的一件有趣的事情。有人说:“同步就像并发”。这不是真的。 同步与并发相反。并发性是当许多事情并行发生时。 同步是当我阻止你。 (约书亚·布洛克)

+0

好吧,当然这就是我想解决这个问题,谷歌只是一个例子:P和感谢提示 – 0x2B

+0

@ 0x2B很乐意帮助你。告诉你这个想法你打算做什么? :) –

+0

我猜它有点尴尬。我不像在这个网站上的人那么好,所以我只是在做我的朋友们要求我为练习和挑战而做的随意的事情。几乎你加载的用户名列表,并检查用户名是否可在网站:)对不起,延迟回复 – 0x2B