对于我们的项目,开发网络压力测试工具,我们是洪水包到整个子网。我们有一个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. java中有多线程的多线程
- 9. Java多线程通信
- 10. 通过java中的多线程读写文件
- 11. (Java多线程)如何在多线程中传递参数?
- 12. 如何通过tkinter中的线程打开多个框架?
- 13. 如何通过PayPal的merchant-sdk-java缩短结算周期的运行时间?
- 14. 多线程Java中
- 15. 如何在Java中使用多线程
- 16. 通过在java中传递参数进行多线程处理
- 17. jQuery的 - 周期插件 - 通过选择
- 18. 关于多线程的java多线程
- 19. 如何通过多线程在MySql中存储数据?
- 20. Java中的多线程
- 21. Java中的多线程
- 22. JFrame中的Java多线程
- 23. Java中的多线程
- 24. Java中的多线程
- 25. Java中的多线程
- 26. java中的多线程
- 27. Java中的多线程
- 28. 条件等待线程消耗太多的CPU周期
- 29. 如何添加的Java多线程
- 30. 多线程通过正确的列表
你是否正在邪恶? – pamphlet 2013-03-27 20:31:27
我不认为我会为这项工作做出贡献。 – Randy 2013-03-27 20:35:58