我有一个守护进程,用于接受来自现场设备的连接 - 他们使用命令/响应进行一些自定义通信。
每次设备连接到端口时,我们都会生成一个线程来处理该通信。每个线程都会自行停止并在通信结束时被销毁。通信可能持续几秒到几分钟。这些线程的产生是在一个永无止境的while循环中完成的,它创建了一个Thread类的新实例,它阻塞了等待接受()与端口的连接,当一个连接产生线程产生时,循环变为回来开始另一个线程spawn并接受()。
当可能的同时连接数量相对较小时,这是可以接受的 - 但我们现在有成千上万的设备可能都在同时尝试通信(最糟糕的情况肯定,但仍然可能的)。
我们想要在传递Thread.activeCount()的某个值后拒绝新连接 - 从外部角度来看,试图打开套接字连接只会失败,因为通过端口是没有打开,连接被拒绝。
下面的代码是我希望可能有效的高度简化的片段,但实际发生的是我们仍然接受来自外部的新连接,它们只是不会附加到线程,直到activeCount下降和连接传递给新线程。
while (1)
{
if (Thread.activeCount() < maxThreads)
{
new MyCustomThread(serverSocket.accept(), dataSource).start();
}
}
当我的activeCount超过某个值时,我是否可以暂时关闭该端口,因此拒绝新连接而不会杀死任何正在进行的连接?