對於我們的項目,開發網絡壓力測試工具,我們是洪水包到整個子網。我們有一個Runnable類,它接收一個端口和廣播地址,並在一段時間(!Thread.currentThread()。isInterrupted)循環中發送一個特定的數據包。然後我們有一個主類,遍歷每個網絡接口和每個可能的端口,並將Runnable類添加到具有1000個線程固定池的ExecutorService。問題是,如果ExecutorService等待當前的1000個線程完成處理,他們永遠不會因爲它們處於while循環。但是,啓動每個線程(65536 *個接口)會佔用太多的內存。我們正在尋找一種在線程中循環的方式,這樣他們都有機會運行一段時間並節省內存,同時仍然保持較高的網絡輸出。如何通過多線程週期中的Java
回答
我想你可能會從更多的線程總是給人更高的吞吐量的誤解是痛苦。通常情況並非如此。
您的應用程序很可能會是CPU綁定,或網卡的吞吐量的約束。強制OS兼顧線程對這些資源的競爭數以萬計是不會增加你的吞吐量。大量的線程只有在線程花費大部分時間等待一些高容量的外部資源(例如數據庫)時纔有用。既然你只是爆炸包裝,並且(大概)對任何反應都不感興趣,那麼就沒有自然的等待點。
我會建議你有處理器和/或網絡卡(取小者),你只爲多線程。
因此,它會同樣使用一個線程?我認爲更多的線程會更快,因爲當我創建了一個端口掃描程序,每個端口有一個超時時間時,多線程可以大大加快程序的速度。 – Samuel 2013-03-27 20:52:45
這可能仍然是多線程的,特別是因爲單個線程的進展速度會更慢,阻塞等待來自網絡的回覆。單線程是一個很好的考慮因素(因爲線程經常被濫用),但是這裏仍然有一個有效的用例... – Krease 2013-03-27 20:57:12
您使用TCP數據包還是單播?如果你正在等待ACK,多線程將提供一些好處。但僅限於一個極限。他們很快就會相互對抗。嘗試1,5,10,50等數字,找到最佳位置。 – pamphlet 2013-03-27 21:05:12
而不是使每個線程始終運行完成或「永遠」,使線程執行一個小的,定義明確的工作集,然後將它們重新添加到執行程序。這種高層次的管理可以通過一個'控制器'風格的對象來完成,該對象通過一系列新的步驟來執行向執行器隊列重新添加任務。
例如,如果每個任務都有1000步,以重複執行: - 任務1運行步驟1-100,然後通過加入本身回用於步驟101-200的執行程序隊列完成 - 任務2得到機會同樣執行(並完成) - 任務1現在位於隊列中,因此它執行101-200,然後返回到201-300的執行器隊列。 - 等到任務1到達結尾 - 901-1000 - 然後如果它想繼續執行,則返回到1-100。
就你而言,不同的步驟可能是端口,不同的線程代表不同的廣播地址 - 按照你認爲合適的方式分解它。
- 1. 顯示通過多線程Java中
- 2. 何時通過Java中的線程選擇多個進程?
- 3. Java線程週期性地殺死一個過程
- 4. Android生命週期/多線程
- 5. 通過多線程
- 6. 線程的生命週期
- 7. 多線程生命週期中的多服務
- 8. 如何在過程生命週期中監控過程狀態
- 9. 如何通過多年和周迭代
- 10. 通過java中的多線程從數據庫中讀取
- 11. java中有多線程的多線程
- 12. 暫停線程週期(android)
- 13. Java多線程通信
- 14. 通過AFNetworking保留週期
- 15. 週期通過對按此
- 16. 通過java中的多線程讀寫文件
- 17. 如何通過Java中的線程將項目添加到ArrayList
- 18. 如何通過Java中的線程傳遞事件?
- 19. 通過多線程排序
- 20. 如何在同一類中使用多線程Java多線程?
- 21. (Java多線程)如何在多線程中傳遞參數?
- 22. java如何處理多線程?比進程更多的線程
- 23. 如何通過多線程將DataRow添加到ViewModel中的DataTable
- 24. 如何通過tkinter中的線程打開多個框架?
- 25. 如何通過PayPal的merchant-sdk-java縮短結算週期的運行時間?
- 26. 如何關閉多線程環境中的線程java
- 27. Java多線程中如何使用CountDownLatch?
- 28. 如何在Java中使用多線程
- 29. 多線程Java中
- 30. 通過在java中傳遞參數進行多線程處理
你是否正在邪惡? – pamphlet 2013-03-27 20:31:27
我不認爲我會爲這項工作做出貢獻。 – Randy 2013-03-27 20:35:58