多线程用于堆积处理, 就像一个大土堆, 一个推土机很慢, 那么 10 个推土机一起来处理, 当然速度就快了, 不过由于位置的限制, 如果 20 个推土机, 那么推土机之间会产生相互的避让, 相互摩擦, 相互拥挤, 反而不如 10 个处理的好, 所以, 多线程处理, 线程数要开的恰当, 就可以提高效率
通俗的解释一下多线程先:
多线程用于堆积处理, 就像一个大土堆, 一个推土机很慢, 那么 10 个推土机一起来处理, 当然速度就快了, 不过由于位置的限制, 如果 20 个推土机, 那么推土机之间会产生相互的避让, 相互摩擦, 相互拥挤, 反而不如 10 个处理的好, 所以, 多线程处理, 线程数要开的恰当, 就可以提高效率
多线程使用的目的:
1 吞吐量: 做 web, 容器帮你做了多线程, 但是它只能帮你做请求层面的, 简单的说, 就是一个请求一个线程(如 struts2, 是多线程的, 每个客户端请求创建一个实例, 保证线程安全), 或多个请求一个线程, 如果是单线程, 那只能是处理一个用户的请求
2 伸缩性: 通过增加 CPU 核数来提升性能
多线程的使用场景:
1 常见的浏览器 Web 服务(现在写的 web 是中间件帮你完成了线程的控制),web 处理请求, 各种专用服务器(如游戏服务器)
2servlet 多线程
3FTP 下载, 多线程操作文件
4 数据库用到的多线程
5 分布式计算
6tomcat,tomcat 内部采用多线程, 上百个客户端访问同一个 WEB 应用, tomcat 接入后就是把后续的处理扔给一个新的线程来处理, 这个新的线程最后调用我们的 servlet 程序, 比如 doGet 或者 dpPost 方法
7 后台任务: 如定时向大量 (100W 以上) 的用户发送邮件; 定期更新配置文件任务调度(如 quartz), 一些监控用于定期信息采集
8 自动作业处理: 比如定期备份日志定期备份数据库
9 异步处理: 如发微博记录日志
10 页面异步处理: 比如大批量数据的核对工作(有 10 万个手机号码, 核对哪些是已有用户)
11 数据库的数据分析(待分析的数据太多), 数据迁移
12 多步骤的任务处理, 可根据步骤特征选用不同个数和特征的线程来协作处理, 多任务的分割, 由一个主线程分割给多个线程完成
13desktop 应用开发, 一个费时的计算开个线程, 前台加个进度条显示
14swing 编程
举一个小栗子:
一个文本文件有 100M, 全是字符串, 我要执行切分字符串, 每达到 N 长度便执行切腹, 最后求切分完成的字符串的集合
单线程处理:
读取文本文件数据, 扫描全部数据, 一个一个的切分, 最后消耗时间 = 文件传输时间(文本数据加载到内存)+ 切分过程消耗
多线程处理:
专门设置一个线程执行加载数据的操作, 此时, 如果加载的数据达到一个设定值, 启动一个切线程处理, 如此继续, 多个切分字符串的线程能够并发执行, CPU 的利用率提高了(文件传输的过程中没有占用处理器, 而可以将加载的部分数据分配给切分线程, 占用处理器来执行任务)
总结:
单线程处理, 文件加载的过程中, 处理器一直空闲, 但也被加入到总执行时间之内, 串行执行切分总时间, 等于每切分一个时间 * 切分后字符串的个数, 执行程序, 估计等几分钟能处理完就不错了
多线程处理, 文件加载过程与拆分过程, 拆分过程与拆分过程, 都存在并发文件加载的过程中就执行了切分任务, 切分任务执行过程中多线程并行处理, 总消耗时间能比单线程提高很多, 甚至几个数量级都不止
- Visual C# 2005 从入门到精通
- Microsoft Visual C# 功能强大使用简单本书全面介绍了如何利用 Visual Studio2005 和 NET Framework 来进行 C# 编程作者将 C# 的各种特性娓娓...
来源: http://developer.51cto.com/art/201804/569572.htm