2015-05-11 121 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