java - 处理许多传入数据包的最佳方法

标签 java multithreading sockets

我目前正在开发一个简单的 P2P 网络作为练习。网络中的每个节点都将心跳发送到其他节点的子集,以便能够检测已离开网络的节点。除了心跳数据包之外,当新节点加入/离开网络时,当它们想要定位资源(小文本文件)等时,我会发送数据包。所有数据包都是 UDP 数据包。

每当我收到一个数据包时,我都会启动一个新线程来处理该特定数据包。然而,我担心我在一个应用程序生命周期内启动的线程数量加起来相当多(特别是因为心跳)。 (还有死锁的风险等我想避免的)。

我想过有一个队列或其他东西,我把所有传入的数据包都放在里面,然后有一个线程一次处理来自该队列的所有数据包(类似于生产者-消费者模式)。我希望数据包能够得到快速处理,这样发件人就不会认为数据包丢失了。

处理大量不同的传入数据包而不必为每个数据包启动一个新线程的最佳方法是什么?我应该使用我拥有的东西,生产者消费还是不同的东西?

最佳答案

您的应用程序处理一个数据包需要多长时间?

对于 ping 的,在接收到它们时处理它们可能会更快,您可以将其他的放在共享数据结构中,例如特定的阻塞队列,因此当队列为空时,工作线程等待新作业,并且当添加新作业时,线程会被唤醒并执行该作业。

可能为每个数据包启动一个线程会使您在启动和停止线程上花费的时间比实际完成这项工作要多。

如果响应数据包的事情对于所有类型的数据包都不是那么耗时,那么可能是花在队列锁和调度线程上的额外时间使你的程序变慢而不是比更快。

在任何情况下都使用线程池并在开始时启动工作人员。如果您愿意,您可以根据过去几分钟的负载动态增加或减少工作线程的数量。

关于java - 处理许多传入数据包的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13635510/

相关文章:

Java 3D - 边界球体

java - 如何加快List的迭代速度

java - 如何在多宿主机器上用 Java 发送和接收 UDP 数据包?

java - 编程可移植voip

linux - epoll_wait() 无限返回 EINTR

java - hibernate/JPQL : How to load parent with all childs based on query on a child

java - 另一个 "Comparison method violates its general contract!"

python - Python 中的事件监听和处理

C# 在一个线程中锁定,调用以在另一个线程中释放

multithreading - Golang 如何在 goroutine 之间共享变量?