多线程优点

尽管面临挑战,仍然使用多线程的原因是多线程可以有几个好处:
1.更好的资源利用率。
2.在某些情况下更简单的程序设计。
3.更灵敏的程序。
更好的资源利用率
想象一下从本地文件系统读取和处理文件的应用程序。假设从磁盘读取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等待第一个文件被读取。然后它开始读取第二个文件。当第二个文件被读取时,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
  }

这样一来,服务器线程就会回来听。因此,更多的客户端可以向服务器发送请求。服务器变得更加敏感。
桌面应用程序也是如此。如果您单击启动长任务的按钮,并且执行任务的线程是更新窗口,按钮等的线程,则在执行任务时,应用程序将显示无响应。相反,任务可以切换到工作线程。当工作线程忙于执行任务时,窗口线程可以自由地响应其他用户请求。当工作线程完成时,它会通知窗口线程。窗口线程可以随着任务的结果来更新应用程序窗口。具有工作线程设计的程序将对用户显示更加响应。

猜你喜欢

转载自blog.csdn.net/lwglwg32719/article/details/77155523