当前位置: 技术问答>java相关
多线程问题,欢迎讨论,up有分(100分,就100分)
来源: 互联网 发布时间:2015-09-08
本文导语: 正在做一个通信系统的服务器软件,采用多线程结构。 程序大概介绍如下: 主线程用来接收客户端的连接,每收到一个连接,就创建一个线程 负责接收客户端发来的消息,并存入一个队列中,然后由一个线...
正在做一个通信系统的服务器软件,采用多线程结构。
程序大概介绍如下:
主线程用来接收客户端的连接,每收到一个连接,就创建一个线程
负责接收客户端发来的消息,并存入一个队列中,然后由一个线程负责处理队列中的客户请求,将结果按消息类型不同分类放到相应的vector空间;同时系统还有还有多个线程负责将不同的vector中的消息发送到相应的客户端(都是死循环,有数据就处理,无数据是暂停线程)。
程序运行是一开始还很正常,但是过一段时间后却发现cup占用达100%,消息处理很慢很慢。
我怀疑跟线程中的死循环有关系,我的程序该如何改进呢?
欢迎个位高手提出宝贵的意见和建议,不胜感激,谢谢先!!!
程序大概介绍如下:
主线程用来接收客户端的连接,每收到一个连接,就创建一个线程
负责接收客户端发来的消息,并存入一个队列中,然后由一个线程负责处理队列中的客户请求,将结果按消息类型不同分类放到相应的vector空间;同时系统还有还有多个线程负责将不同的vector中的消息发送到相应的客户端(都是死循环,有数据就处理,无数据是暂停线程)。
程序运行是一开始还很正常,但是过一段时间后却发现cup占用达100%,消息处理很慢很慢。
我怀疑跟线程中的死循环有关系,我的程序该如何改进呢?
欢迎个位高手提出宝贵的意见和建议,不胜感激,谢谢先!!!
|
是不是当发送线程处理玩数据后,跳出循环,然后当有消息到来时
再重新调用线程的start()方法开始处理数据,这样就不存在死循环问题了。
一点拙见,请到家批评指正!!
再重新调用线程的start()方法开始处理数据,这样就不存在死循环问题了。
一点拙见,请到家批评指正!!
|
我觉得可能是由于太多的线程监视器(锁)没有被正确的释放,如果客户不是特别多,是不是应该考虑用线程池的技术。另外注意同步的合理应用。
|
可以试着采用线程回调的方法避免用死循环检测是否有消息。
就是在收到消息的时候调用处理消息的方法
这方面的问题《Java网络编程》中的线程那章有很好的说明。
就是在收到消息的时候调用处理消息的方法
这方面的问题《Java网络编程》中的线程那章有很好的说明。
|
线程一被建立并运行便只会朝着“死”的方向走去,除非你的run()方法里面是个死循环——除非你把整个程序关掉否则是不会被系统回收的。如果你能够很好地利用好几个已建立的线程,一直为你服务,则能够达到运行效率块、节省资源。
看样子,线程池是很适合你的要求的。
看样子,线程池是很适合你的要求的。
|
答案是这样的:
无限制的等待必然耗尽CPU的资源,可以用设置信号量来解决
即:只有在客户端有消息来的时候才开始等待接受,否则不等待(可以设置等待时间,比如5),超时则退出循环
我所说的是在Vc下的解决办法,VC下有WaitForSingleObject 等方法可以使用
,Java 下虽然没有消息机制,但是可以自己设定信号量
无限制的等待必然耗尽CPU的资源,可以用设置信号量来解决
即:只有在客户端有消息来的时候才开始等待接受,否则不等待(可以设置等待时间,比如5),超时则退出循环
我所说的是在Vc下的解决办法,VC下有WaitForSingleObject 等方法可以使用
,Java 下虽然没有消息机制,但是可以自己设定信号量
|
没有释放资源造成的吧
|
线程建立-->等待-->运行(或挂起)-->结束
|
其实NutShell系列书籍中的《Java网络编程》上讲的很清楚透彻。
还有实例,可以好好看看。
我喜欢在书店看,^_^
还有实例,可以好好看看。
我喜欢在书店看,^_^
|
是没有释放资源造成的吧,(看不到源代码一下子也说不清楚啊...........)
|
主线程用来接收客户端的连接,每收到一个连接,就创建一个线程
你这样创建有没有上限啊?创建线程也是需要消耗资源的。
你这样创建有没有上限啊?创建线程也是需要消耗资源的。
|
可以使用ProducerConsumer设计模式。
|
太多的线程监视器(锁)没有被正确的释放,应该考虑用线程池的技术
|
是啊!
听你的介绍好象只有分配资源,没有回收吧!
“每收到一个连接,就创建一个线程”
听你的介绍好象只有分配资源,没有回收吧!
“每收到一个连接,就创建一个线程”
|
gz,up一下下
|
help you
|
啊,我也没用过信号量,学习学习。