1. 首页
  2. IT资讯

简单分享:多线程的优点

“u003Cpu003E尽管面临很多挑战,多线程有一些优点使得它一直被使用。这些优点是:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E资源利用率更好u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E程序设计在某些情况下更简单u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E程序响应更快u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E资源利用率更好u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要:u003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cpu003E5秒读取文件Au003Cu002Fpu003Eu003Cpu003E2秒处理文件Au003Cu002Fpu003Eu003Cpu003E5秒读取文件Bu003Cu002Fpu003Eu003Cpu003E2秒处理文件Bu003Cu002Fpu003Eu003Cpu003E———————u003Cu002Fpu003Eu003Cpu003E总共需要14秒u003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpu003E从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据。在这段时间里,CPU非常的空闲。它可以做一些别的事情。通过改变操作的顺序,就能够更好的使用CPU资源。看下面的顺序:u003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cpu003E5秒读取文件Au003Cu002Fpu003Eu003Cpu003E5秒读取文件B + 2秒处理文件Au003Cu002Fpu003Eu003Cpu003E2秒处理文件Bu003Cu002Fpu003Eu003Cpu003E———————u003Cu002Fpu003Eu003Cpu003E总共需要12秒u003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpu003ECPU等待第一个文件被读取完。然后开始读取第二个文件。当第二文件在被读取的时候,CPU会去处理第一个文件。记住,在等待磁盘读取文件的时候,CPU大部分时间是空闲的。u003Cu002Fpu003Eu003Cpu003E总的说来,CPU能够在等待IO的时候做一些其他的事情。这个不一定就是磁盘IO。它也可以是网络的IO,或者用户输入。通常情况下,网络和磁盘的IO比CPU和内存的IO慢的多。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E程序设计更简单u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E在单线程应用程序中,如果你想编写程序手动处理上面所提到的读取和处理的顺序,你必须记录每个文件读取和处理的状态。相反,你可以启动两个线程,每个线程处理一个文件的读取和操作。线程会在等待磁盘读取文件的过程中被阻塞。在等待的时候,其他的线程能够使用CPU去处理已经读取完的文件。其结果就是,磁盘总是在繁忙地读取不同的文件到内存中。这会带来磁盘和CPU利用率的提升。而且每个线程只需要记录一个文件,因此这种方式也很容易编程实现。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E程序响应更快u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E将一个单线程应用程序变成多线程应用程序的另一个常见的目的是实现一个响应更快的应用程序。设想一个服务器应用,它在某一个端口监听进来的请求。当一个请求到来时,它去处理这个请求,然后再返回去监听。u003Cu002Fpu003Eu003Cpu003E服务器的流程如下所述:u003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cpreu003Eu003Ccodeu003Ewhile(server is active){u003Cu002Fcodeu003Eu003Ccodeu003E listen for requestu003Cu002Fcodeu003Eu003Ccodeu003E process requestu003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpu003E如果一个请求需要占用大量的时间来处理,在这段时间内新的客户端就无法发送请求给服务端。只有服务器在监听的时候,请求才能被接收。另一种设计是,监听线程把请求传递给工作者线程(worker thread),然后立刻返回去监听。而工作者线程则能够处理这个请求并发送一个回复给客户端。这种设计如下所述:u003Cu002Fpu003Eu003Cpreu003Eu003Cdivu003Eu003Cpreu003Eu003Ccodeu003Ewhile(server is active){u003Cu002Fcodeu003Eu003Ccodeu003E listen for requestu003Cu002Fcodeu003Eu003Ccodeu003E hand request to worker threadu003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cu002Fdivu003Eu003Cu002Fpreu003Eu003Cpu003E这种方式,服务端线程迅速地返回去监听。因此,更多的客户端能够发送请求给服务端。这个服务也变得响应更快。u003Cu002Fpu003Eu003Cpu003E桌面应用也是同样如此。如果你点击一个按钮开始运行一个耗时的任务,这个线程既要执行任务又要更新窗口和按钮,那么在任务执行的过程中,这个应用程序看起来好像没有反应一样。相反,任务可以传递给工作者线程(word thread)。当工作者线程在繁忙地处理任务的时候,窗口线程可以自由地响应其他用户的请求。当工作者线程完成任务的时候,它发送信号给窗口线程。窗口线程便可以更新应用程序窗口,并显示任务的结果。对用户而言,这种具有工作者线程设计的程序显得响应速度更快。u003Cu002Fpu003Eu003Cpu003E来源:并发编程网u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”span”u003E链接:u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fifeveu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E.comu003Cu002Fiu003Eu002Fbenefitsu002Fu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E-END-u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E如果看到这里,说明你喜欢这篇文章,请转发、点赞。u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003E微信u003Cu002Fiu003E搜索「web_resource」,u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003E关注u003Cu002Fiu003E后回复「进群」或者扫描下方二维码即可进入无广告交流群。u003Cu002Fpu003E”

原文始发于:简单分享:多线程的优点

主题测试文章,只做测试使用。发布者:逗乐男神i,转转请注明出处:http://www.cxybcw.com/17886.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code