Java并发编程(Java Concurrency)(2)- 多线程的好处

来源:互联网 发布:广告公司做图软件 编辑:程序博客网 时间:2024/05/22 17:22

原文链接:http://tutorials.jenkov.com/java-concurrency/benefits.html

  摘要:这是翻译自一个大概30个小节的关于Java并发编程的入门级教程,原作者Jakob Jenkov,译者Zhenning Lang,转载请注明出处,thanks and have a good time here~~~(希望自己不要留坑)

第二节 多线程的好处

尽管多线程编程充满调整,但其仍被使用的原因是多线程可以带来很多好处,其中的一些如下:

  • 更有效的资源利用
  • 一些情况下程序设计将变得更加简单
  • 使程序具有更好的响应性

更有效的资源利用

考虑一个应用程序从本地文件系统读取并处理文件。假设从磁盘读取文件需要5秒,而处理文件需要2秒,那么处理两个文件花费

1.读文件A(花费5秒) 2.处理文件A(花费2秒) 3.读文件B(花费5秒) 4.处理文件B(花费2秒) 总共花费14秒

当从磁盘上读取文件时,CPU花费了大部分的时间等待磁盘的数据读取。这期间CPU具有大量的空闲,可以被用来作其他工作。如果将以上操作的顺序进行调换,CPU可以得到更充分的使用,具体如下:

1.读文件A(花费5秒) 2.读文件B(花费5秒)+处理文件A(花费2秒) 3.处理文件B(花费2秒) 总共花费12秒

CPU首先等待文件A的读取;随后立刻读取文件B,而在文件B的读取过程中,CPU同时处理文件A。(当然其前提是当从磁盘上读取文件时CPU大多是时间是空闲的)

通常而言,CPU在等待I/O的过程中可以用来做其他的事情。这里的I/O不一定是磁盘的I/O,也可能是网络I/O,或者用户的输入。网络和磁盘I/O通常要慢于CPU和内存的I/O。

使程序设计将变得更加简单

如果你要利用单线程编写上述同时读取和处理文件的例子,你必须处理好每个文件的读取和处理的状态。但是如果你用两个线程分别读取和处理单个的文件,每个线程在等待从磁盘读取文件时都会被阻塞,在这个等待的过程中,其他的线程就可以充分地利用CPU来处理他们已经读取了的文件。这样一来,磁盘一直在运作,将不同的文件读入内存,这将同时提高磁盘和CPU的利用率。同时这个例子中程序也更加容易编写,因为每个线程仅仅处理单个的文件而不需要考虑全局。

使程序具有更好的响应性

多线程的另一个好处是使得程序具有更好的响应性。假设一个服务器程序正在监听一些端口的请求消息,当一个请求到达时,程序就处理这个请求然后继续其监听。服务器程序的流程如下:

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

如果处理一个请求的时间过长,这期间其他的来自客户端的请求将无法被服务器捕获。只有当服务器监听时请求才能得到响应。

另一种设计是让监听线程将监听到的请求传递给处理线程,然后立即继续监听。处理线程处理请求并向客户端发送回复。其流程如下:

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

这样一来服务器始终处于监听中,不存在无法被捕获的请求,服务器的响应能力得到了提升。

这个好处对于桌面应用程序来说同样适用。如果你点击一个按钮,这个按钮启动了一个长时间的任务,而执行这个任务的线程就是更新窗口和按钮等控件的线程,那么当这个任务被执行时,程序将失去响应。另一种程序结构是,这个任务可以被传给一个处理线程来进行处理。这样当处理线程处理这个任务的时候,窗口依旧可以响应其他的用户操作。当处理线程运行结束后,他将给窗口线程发送消息。窗口线程根据任务的处理的结果来更新应用的窗口显示。可以看出,具有单独的任务处理线程的设计对于用户来说具有更好的响应性能。

0 0
原创粉丝点击