工作一年多,在技术层面上一直没有太大的成就。总感觉每天都在重复着一件事情,需求,改,需求,再改。在这种重复中,开始变得有些暴躁。很希望能也有所突破,今天刚刚开通了CSDN博客。决定在这个满是大牛的平台上,留下自己的每一点学习过程,也在大家面前呈现自己的编程错误和误区。希望各位大牛能不惜赐教,对文章中有的错误一定要指出来,这会是我最大的收获。
前段时间,经手一个网络相关软件的开发。由于是新手,在接触到这个项目的时候一时没有太多的头绪。其中有一个关于UDP网络传输中的重传问题,思考了好久自己只能想到一个很耗费资源和调度的方法。最初的想法是这样的:
功能要求是消息发送间隔1秒,需要有三次重传的机制,当超过三次则改发送间隔为3秒。
1、建立消息处理结构:包括消息ID、消息状态(是否发送成功)、重传次数、重传超时时间。
2、建立接收消息线程,当受到消息时,通过消息的ID将消息的状态设定为发送成功。
3、建立发送消息方法,将消息加入发送队列,调用线程循环:判断消息状态(break)、发送消息、sleep、重传次数++、判断重传次数,修改sleep时间。
如此一来,虽说实现了消息的发送,但是对于程序的执行起来,每一次发送都需要新起调用线程进行处理。一来程序的开销变得很大;二来,受Windows系统线程最大数量的限制,当连续收发一段时间之后软件最终崩溃了。查询得知可能是系统限制上的问题之后,居然考虑到了调用线程池的方式来处理这样的问题。在进行过一番尝试之后,发现这样的处理只是使这一块的调度变得很是复杂,且多线程之间的数据同步也