多线程问题,欢迎讨论,up有分(100分,就100分)

yipinrfr 2002-09-19 12:06:49
正在做一个通信系统的服务器软件,采用多线程结构。
程序大概介绍如下:
主线程用来接收客户端的连接,每收到一个连接,就创建一个线程
负责接收客户端发来的消息,并存入一个队列中,然后由一个线程负责处理队列中的客户请求,将结果按消息类型不同分类放到相应的vector空间;同时系统还有还有多个线程负责将不同的vector中的消息发送到相应的客户端(都是死循环,有数据就处理,无数据是暂停线程)。

程序运行是一开始还很正常,但是过一段时间后却发现cup占用达100%,消息处理很慢很慢。
我怀疑跟线程中的死循环有关系,我的程序该如何改进呢?
欢迎个位高手提出宝贵的意见和建议,不胜感激,谢谢先!!!
...全文
98 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunlinux 2002-09-19
  • 打赏
  • 举报
回复
是没有释放资源造成的吧,(看不到源代码一下子也说不清楚啊...........)
babyfu 2002-09-19
  • 打赏
  • 举报
回复
gz,up一下下
iamcyh 2002-09-19
  • 打赏
  • 举报
回复
可以试着采用线程回调的方法避免用死循环检测是否有消息。
就是在收到消息的时候调用处理消息的方法
这方面的问题《Java网络编程》中的线程那章有很好的说明。
qxjavajava 2002-09-19
  • 打赏
  • 举报
回复
我觉得可能是由于太多的线程监视器(锁)没有被正确的释放,如果客户不是特别多,是不是应该考虑用线程池的技术。另外注意同步的合理应用。
owenyang 2002-09-19
  • 打赏
  • 举报
回复
线程建立-->等待-->运行(或挂起)-->结束
chl 2002-09-19
  • 打赏
  • 举报
回复
线程一被建立并运行便只会朝着“死”的方向走去,除非你的run()方法里面是个死循环——除非你把整个程序关掉否则是不会被系统回收的。如果你能够很好地利用好几个已建立的线程,一直为你服务,则能够达到运行效率块、节省资源。
看样子,线程池是很适合你的要求的。
pzl686 2002-09-19
  • 打赏
  • 举报
回复
是不是当发送线程处理玩数据后,跳出循环,然后当有消息到来时
再重新调用线程的start()方法开始处理数据,这样就不存在死循环问题了。
一点拙见,请到家批评指正!!
cnjava 2002-09-19
  • 打赏
  • 举报
回复
没有释放资源造成的吧
yipinrfr 2002-09-19
  • 打赏
  • 举报
回复
我也认为是资源没有回收的问题,采用信号量方法可以考虑,到家还有什么高见,欢迎不吝赐教.
whyyy78 2002-09-19
  • 打赏
  • 举报
回复
啊,我也没用过信号量,学习学习。
yongwolf 2002-09-19
  • 打赏
  • 举报
回复
是啊!
听你的介绍好象只有分配资源,没有回收吧!
“每收到一个连接,就创建一个线程”
Javatomchen 2002-09-19
  • 打赏
  • 举报
回复
答案是这样的:
无限制的等待必然耗尽CPU的资源,可以用设置信号量来解决
即:只有在客户端有消息来的时候才开始等待接受,否则不等待(可以设置等待时间,比如5),超时则退出循环
我所说的是在Vc下的解决办法,VC下有WaitForSingleObject 等方法可以使用
,Java 下虽然没有消息机制,但是可以自己设定信号量
yipinrfr 2002-09-19
  • 打赏
  • 举报
回复
看来明天得请假上书店去了,哈哈
谢谢各位的建议,欢迎继续讨论。
webspider 2002-09-19
  • 打赏
  • 举报
回复
其实NutShell系列书籍中的《Java网络编程》上讲的很清楚透彻。
还有实例,可以好好看看。

我喜欢在书店看,^_^
yipinrfr 2002-09-19
  • 打赏
  • 举报
回复
那未能介绍一下线程池的用法?
preston_gzw 2002-09-19
  • 打赏
  • 举报
回复
太多的线程监视器(锁)没有被正确的释放,应该考虑用线程池的技术
webwing 2002-09-19
  • 打赏
  • 举报
回复
可以使用ProducerConsumer设计模式。
松耦合紧内聚 2002-09-19
  • 打赏
  • 举报
回复
help you
upc_chenli 2002-09-19
  • 打赏
  • 举报
回复
主线程用来接收客户端的连接,每收到一个连接,就创建一个线程

你这样创建有没有上限啊?创建线程也是需要消耗资源的。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧