一个简单的Socket消息转发程序中使用ThreadPool和不使用的性能比对
来源:互联网 发布:查看域名注册信息 编辑:程序博客网 时间:2024/05/21 22:55
最近做一个小程序,要求不难,就是一个有若干Client连接到一个Server上,然后Client可以向Server发消息,Server把这个消息存入MySQL,并转发给各个Client 。我的大致思路是:每个Client上启动两个线程,一个ClientRecevieThread负责接收Server传来的消息,另一个ClientSendThread负责将自己的消息发送给Server。然后Server上针对每个连接的Client启动一个ClientThread线程,负责接收这个Client传来的消息,Server上还要启动一个总的线程SendThread,由其负责向所有Client转发消息。在具体实现时:每当有Client连接上Server时,即将其add到一个clientList里面,如果这个Client退出,则再remove掉。在发送消息的过程中,ClientSendThead先将msg发送给Server上的ClientThread,由这个ClientThread纪录下收到的消息的时间,消息的发送者等信息,并将他们一起封装到一个自定义的Message类中,并将这个Message加到一个用LinkedList实现的消息队列msgList的末尾。Server上的SendThread则依次读取msgList中的Message,把他们保存到MySQL中,并将其中的msgContent发送个clientList里面的客户端,做完这些事情后,即msgList.removeFirst()。整个过程如下所示:
这个程序我一开始是用线程池实现的。采用了ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)这种构造方法构造出一个pool,使用pool.execute方法启动各个线程。在我模拟多用户同时登陆并发送消息时,发现采用线程池时,程序的运算速度很慢。后来我又采用直接让线程自己start()的方法,发现速度提高很快。以下是我统计出的一个表格:
结果已经很明显了,所以2000用户发消息的线程池模拟我就没做。照理来说,采用线程池应该能提高程序性能才对。但是在这个程序中采用线程池却导致了性能的大幅下降。至于其中原因我现在也不是特别清楚。
- 一个简单的Socket消息转发程序中使用ThreadPool和不使用的性能比对
- 一个threadpool的使用
- 简单的Socket消息转发实现
- 对threadpool的性能测试
- 一个线程池(ThreadPool)的使用
- 使用ServerSocket、Socket创建一个简单的服务聊天程序
- 使用socket和mysql编写一个简单的物联网服务器程序
- 一个简单的ThreadPool分析
- 广泛使用的一个对特定在线用户发送系统消息的程序
- 改善C#程序的建议9:使用Task代替ThreadPool和Thread (转)
- (转载)改善C#程序的建议9:使用Task代替ThreadPool和Thread (转)
- 改善C#程序的建议9:使用Task代替ThreadPool和Thread
- 改善C#程序的建议9:使用Task代替ThreadPool和Thread
- 改善C#程序的建议9:使用Task代替ThreadPool和Thread
- 改善C#程序的建议9:使用Task代替ThreadPool和Thread
- 在执行一个 CLR 例程或 SQL Server 2005 中使用程序集时的错误消息:"在主机存储区中的组件在 GAC 中有一个不同的签名比程序集。
- c#的ThreadPool使用笔记
- ThreadPool 线程池的使用
- 实现简单的struts,hibernate上传文件
- RegisterStartupScript和RegisterClientScriptBlock输出位置的区别
- 关于时间的模糊查询
- 制作WHOIS的源代码
- MIPS Linux 下添加系统调用
- 一个简单的Socket消息转发程序中使用ThreadPool和不使用的性能比对
- oracle中某月天数的获取
- 正则模式修正符
- 话说罗盘
- 我设计的UNIX根文件系统目录结构
- Chapter 3(1): Helper Classes
- 做数据表比较的存储过程
- 写给我小弟的PHP培训教材!
- 基民增速赶超股民