多线程的好处

原文地址:http://tutorials.jenkov.com/java-concurrency/benefits.html

多线程编程是有一定的挑战,但除了挑战,还有一些好处,这些好处如下:

  • 更好的资源利用率
  • 简单的程序设计在某些场景下。
  • 更快的响应程序。

更好的资源利用率

假设一个应用程序从本地文件系统中读取和处理文件。从硬盘读取文件需要花费5秒,然后再处理需要2秒,处理两个文件需要花费的时间如下:

当程序从磁盘读取文件的时候,大多数时间CPU都处于等待状态,在这期间CPU是十分空闲的。而这个时候CPU是可以用于做其他事情的。比方说通过改变操作顺序,CPU资源能够更好的被利用,比如说这样的顺序:

CPU在等待第一个文件被读取,然后开始读取第二个文件。随着第二个文件开始读取,CPU可以用于处理第一个文件。还记得,在等待文件从磁盘读取的过程中,CPU是十分空闲的。

总的来说,在等待IO的过程中,CPU能够做一些其他的事情。这并不仅仅适用于磁盘IO,网络IO或者其他输入等等,都是适用的场景。网络和磁盘IO通常是一个非常缓慢的过程和CPU和内存IO相比来说。

简单的程序设计

如果你通过单一线程应用来设计上述顺序的读取和处理应用,你不得不跟踪每个文件的读取和处理过程。然而你可以启动两个线程,每一个线程只跟踪一个文件的读取和处理。这两个线程都会被阻塞在读取磁盘文件的过程中,然后在阻塞的过程中,如果有部分文件是读取就绪的情况下,另外的线程是可以使用CPU来处理的。所以结果就是磁盘一直保持忙碌,用于读取多个文件到内存。而这样能够很好的利用不仅仅是磁盘而且CPU的利用率也变高。当然这个过程中也更容易编写,因为每个线程只有需要追踪一个文件。

更快的响应程序

另一个通用的目的,关于从单一线程应用到多线程应用,就是更快的响应。假设一个服务端应用监听了一些端口等待请求到来,。当一个请求到达后,它处理请求,然后继续监听,服务端的循环流程大概如下:

如果处理一个请求需要很长时间,那么在这期间,不会有新的客户端能够发送请求到服务端,只有当服务器处理完请求并重新监听后,请求才能被再次接受。

一个比较好的设计是对于监听线程在接收到请求后,把请求专递给工作线程,然后立马继续监听。而工作线程将处理请求缤纷发送一个响应到客户端。这个设计类似如下:

这种方式保证了服务线程能够快速返回监听。这样就能够有更多的客户端发送请求到服务端,而服务端变的更加及时的响应。

而对于桌面应用也是类似的。如果你单击按钮开始一个长时间的任务比方说系统更新的任务,那么应用会出现无响应状态,直到任务结束。而如果把任务交给工作线程,而系统线程处理其他事件,则不会出现无响应。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值