如何在Java中循环遍历许多线程

时间:2013-03-27 20:29:27

标签: java multithreading networking concurrency

对于我们开发网络压力测试工具的项目,我们将数据包充斥到整个子网。我们有一个Runnable类,它接受一个端口和广播地址,并在一段时间内(!Thread.currentThread()。isInterrupted)循环,它发送一个特定的数据包。然后我们有一个主类,它遍历每个网络接口和每个可能的端口,并将Runnable类添加到具有1000个线程固定池的ExecutorService。问题是如果ExecutorService等待当前的1000个线程完成处理,它们永远不会,因为它们处于while循环中。但是,启动每个线程(65536 *接口数)会占用太多内存。我们正在寻找一种循环线程的方法,这样他们都有机会在保持高网络输出的同时运行一段时间并节省内存。

2 个答案:

答案 0 :(得分:0)

我认为您可能会误以为更多线程总能提供更高的吞吐量。通常情况并非如此。

您的应用程序很可能受CPU限制,或受网卡吞吐量的限制。迫使操作系统处理数以万计竞争这些资源的线程将增加您的吞吐量。大量线程仅在线程花费大部分时间等待某些高容量外部资源(例如数据库)时才有帮助。由于你只是爆破数据包并且(可能)对任何响应都不感兴趣,所以没有自然的等待点。

我建议您只拥有与处理器和/或网卡一样多的线程(以较小者为准)。

答案 1 :(得分:0)

不是让每个线程始终运行完成或“永远”运行,而是让线程执行一个小的,定义良好的工作集,然后将它们重新添加到执行程序中。这种高级管理可以通过“控制器”样式对象来完成,该对象管理重新添加到执行程序队列的任务,并执行一系列新步骤。

例如,如果每个任务都有1000个重复执行的步骤: - 任务1运行步骤1-100,然后通过将自身添加回执行程序队列来完成步骤101-200 - 任务2有机会同样执行(并完成) - 任务1现在是队列中的下一个,因此它执行101-200,然后添加回201-300的执行程序队列。 - 等等,直到任务1到达终点 - 901-1000 - 然后如果它想继续执行,再次返回1-100。

在您的情况下,不同的步骤可能是端口,不同的线程代表不同的广播地址 - 在您认为合适时将其分解。