多线程的好处

最典型的多线程的好处如下:

  • 更好的CPU 利用率
  • 在一些情况下简化程序的设计
  • 更具响应性的程序
  • 不同任务中更公平的CPU 资源分工

更高的CPU 使用效率

设想一个程序从本地文件系统读取和处理文件。假设从磁盘读取af 文件需要 5秒,处理它需要 2秒。

  5 seconds reading file A
  2 seconds processing file A
  5 seconds reading file B
  2 seconds processing file B
-----------------------
 14 seconds total

当从磁盘的读取文件时,CPU 主要的时间花费在了等待从磁盘读取数据。CPU 浪费了这个时间。它本可以做一些其他的事情。 根据改变操作的排序,CPU获得更高的使用率。 看下面的排序:

  5 seconds reading file A
  5 seconds reading file B + 2 seconds processing file A
  2 seconds processing file B
-----------------------
 12 seconds total

CPU 等待第一个文件被读取。 然当他开始读取第二个文件的, 当第二个被电脑的 IO 组件开始读取时,CPU处理第一个文件。 记住,当等待从磁盘读取文件时, CPU 近乎在浪费。

通常来说,CPU 在等待 IO 时能够做其他的事情。 他不一定非得是磁盘IO. 他也可以是网络IO ,或者机器中来自用户的输入。 网络和磁盘IO 比CPU 和内存IO 经常会慢很多。

简化程序设计

如果你在一个单线程应用程序关系到读取和操作的排序时, 你会不得不关注每个文件读取和操作的状态。 你可以开启两个线程,每个线程只读取和操作单位文件。每一个线程将会在等待从磁盘的文件中读取而被阻塞。 在等待的同时,其他线程可以使用CPU 去操作其他已经被读取的文件。这样的结果是,磁盘一直在工作,从不同的文件读取到内存中。 这个对磁盘和CPU 的利用率都更好。 对比以前一个线程只操作单个的文件来说,这也使得编程更为简便。

更具有响应性的程序

另一个吧单线程应用转变为多线程应用的目的是使程序更具有响应性。 假设一个服务器应用接听某些端口进来的请求。当一个请求到达后,它会持有这个请求然后回到接听,这个服务器循环如下:

  while(server is active){
    listen for request
    process request
  }

如果执行这个请求占用太多的时间, 没有新的客户端可以在此期间发送请求。 只有当服务器处于监听时才可以接收请求。

另一个设计是将监听的线程接收到请求后传递给一个工作线程,然后又立刻返回监听线程。这个工作线程将会处理这个请求然后给客户端发送回应。这个设计如下:

  while(server is active){
    listen for request
    hand request to worker thread
  }

这个方式工作的服务器线程会很快返回监听。所以更多客户端可以像服务器发送请求。 这个服务器会更具有响应性。

这对桌面应用同样有效。 如果你点击一个按钮需要开启一个很长的任务,这个线程执行的任务包括线程更新窗口,按钮等等。然后这个应用当这个任务执行时会发生无响应。 对应的来说这个任务也可以交给工作线程来处理。当这个工作线程正在处理这个任务时,桌面线程可以继续接收其他用户的请求。 当这个工作线程完整工作以后会给窗口线程一个信号。 窗口线程可以根据任务的结果更新应用窗口。这个程序因为有了工作线程设计变得对用户更具有响应性。

CPU资源分配更为公平

设想一个服务器从客户端接收请求,然后其中一个客户端发送请求,这个请求耗费了10秒的执行时间,如果这个服务器使用一个线程处理所有请求,那么所有请求将会强制进行等待直到这个请求被执行完成,这会处理的十分缓慢。

通过多线程和线程选择之间分散CPU时间,让CPU 能够再几个请求之间更为公平的分享执行时间。甚至说如果一个请求很缓慢,其他快速处理的请求何以同这个慢的请求同时执行。 当然这也意味着执行这个缓慢的请求会更缓慢,因为他将不会有CPU单独只为了它申请执行。然而,其他请求只要等待很短时间就可以执行,因为在她们被执行前不需要等待那些执行慢的任务。如果只有执行慢的请求在执行,这样CPU 仍然能够单独分配给慢的任务。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值