【01】多线程带来的好处

即便多线程会更有挑战,更有难度。 但是不能否认,多线程会带来一些好处:

  1. 更好的资源利用率
  2. 某些场景中,程序设计可以更为简洁
  3. 更好的响应性

资源利用率

想象一下,有一个应用,负责从本地文件系统中读取文件并处理这些文件。 假设:读取文件需要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本可以做点其他事情的。 调整一下操作的顺序,更好的利用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等待第一个文件读取完成后,开始读取第二个文件。 当第二个文件开始读取时,CPU开始处理第一个文件。 要知道,在等待文件读取的过程中,CPU其实是空闲的。

一般来说,当CPU在等待IO操作时,是可以处理其他事情的。 CPU并不会参与磁盘IO传输。网络IO,以及等待用户输入的过程也类似。 网络以及磁盘IO通常都会比CPU以及内存IO要慢几个数量级。

简化程序设计

如果是设计一个单线程应用来处理上述文件处理的话,需要记录每个文件的读取/处理状态。 而如果开启两个线程分别处理两个文件,每个线程都阻塞等待文件读取。 在等待时,其他完成文件读取的线程可以使用CPU进行文件的处理。 结果就会是,磁盘可以一直读取各种数据到内存;而CPU也被充分的使用。 这样,CPU与磁盘的利用率都提高了。 同时,这样的设计,也会让每个线程都只关心自己的文件,也使得逻辑更为简单。

响应性

应用从单线程改成多线程,另一个主要目的就是为了让应用有更好的响应性。 假设一个服务应用,监听某个端口的请求。 当请求到达,应用处理请求并继续监听。 服务可以循环处理:

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

如果请求处理需要很长的时间,那在此期间,服务就无法接收到新的客户端请求。

另一个设计,监听线程收到请求后,将请求交给工作线程,然后立即返回继续监听。 工作线程会处理请求并回复客户端:

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

服务线程可以很快再次监听下一个请求。因此,服务就可以处理更多的客户端请求。 这样服务就有了更好的响应性。

桌面应用同样也是。如果点击按钮会触发一个需要很长时间才能完成的任务,使用同一个一个线程去处理任务以及更新窗口、按钮等UI部件,那应用就会显得迟钝。 而如果将任务移交给另一个工作线程,那UI线程就能腾出来去处理其他的用户操作。 当工作线程完成任务后,给UI线程发一个信号。UI线程收到信号后,就会根据任务结果来更新窗口。 使用这种工作线程的设计,对用户来说就有了更好的响应性。

转载于:https://my.oschina.net/roccn/blog/1162941

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值