将JavaNIO用于数千个传出连接

将JavaNIO用于数千个传出连接,java,proxy,nio,Java,Proxy,Nio,我正在寻找一个快速的解决方案来检查列表中代理的可用性(高达10k) 如果我们可以连接到代理,代理是可用的,所以要检查10k代理,我们必须发出10k请求。由于连接超时设置为10秒,因此请求应该是并行的 现在检查可用性的方法如下: private boolean isAvailable(Proxy proxy) { try { URL u = new URL(url); HttpURLConnection conn = (HttpURLConnection)

我正在寻找一个快速的解决方案来检查列表中代理的可用性(高达10k)

如果我们可以连接到代理,代理是可用的,所以要检查10k代理,我们必须发出10k请求。由于连接超时设置为10秒,因此请求应该是并行的

现在检查可用性的方法如下:

private boolean isAvailable(Proxy proxy) {
    try {
        URL u = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) u.openConnection(proxy);
        conn.connect();
        LOG.warn("Proxy " + proxy.address() + " is OK");
        conn.disconnect();
        return true;
    } catch (Exception e) {
        LOG.warn("Proxy " + proxy.address() + " is unavailable");
        return false;
    }
}
在Java中运行10k个线程不是一个好主意,即使32个线程的合理数量也会给我们(10.000/32)*10=3100秒的持续时间

因此,我认为带选择器的JavaNIO是这里的最佳选择,但我不记得教程中的示例,它们的目的是扩展这么多。我想像netty这样的第三方库可以很容易地解决这个问题,但我想看看如何用纯java很好地完成这个任务


另外,由于资源使用,我的场景是否有任何阈值?客户端连接是否占用资源,因此最好只使用500个同时请求?此场景是否有理论上的最大值(除端口数外)?

用于扩展的示例是什么样的?与普通的例子相反?你在寻找一些不存在的东西。所有NIO代码规模。如果您有一个真正的问题,而不仅仅是请求一个异地资源,请提问,但这不是一个问题。@EJP示例在教程中通常说:“这里有三个通道和一个选择器上的一个线程,一切都很好”,但我不确定一个线程是否足以容纳5000个通道。另外,还有一个关于资源消耗的问题。你真的想同时并行完成10000个任务吗?在这种情况下,您的程序可能不是瓶颈。10个线程,循环中每个线程有100个选择器,10x听起来更合理,但这取决于您的要求。@JJF我需要尽快使用它,这是程序的初始阶段,线程数量不受限制。@AdamSkywalker当时有他们说的。要知道是否可以等待5000个选择器,唯一的方法就是尝试一下。一切都需要资源,我知道没有限制。你在这里有一个比较独特的情况,要想知道什么是有效的,唯一的办法就是尝试一些实验。祝你好运