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秒,那么处理两个文件花费
当从磁盘上读取文件时,CPU花费了大部分的时间等待磁盘的数据读取。这期间CPU具有大量的空闲,可以被用来作其他工作。如果将以上操作的顺序进行调换,CPU可以得到更充分的使用,具体如下:
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}
这样一来服务器始终处于监听中,不存在无法被捕获的请求,服务器的响应能力得到了提升。
这个好处对于桌面应用程序来说同样适用。如果你点击一个按钮,这个按钮启动了一个长时间的任务,而执行这个任务的线程就是更新窗口和按钮等控件的线程,那么当这个任务被执行时,程序将失去响应。另一种程序结构是,这个任务可以被传给一个处理线程来进行处理。这样当处理线程处理这个任务的时候,窗口依旧可以响应其他的用户操作。当处理线程运行结束后,他将给窗口线程发送消息。窗口线程根据任务的处理的结果来更新应用的窗口显示。可以看出,具有单独的任务处理线程的设计对于用户来说具有更好的响应性能。
- Java并发编程(Java Concurrency)(2)- 多线程的好处
- Java并发编程(Concurrency)并发模型
- Java并发编程---多线程的好处
- Java并发编程(Java Concurrency)(3)- 多线程的代价
- Java并发编程(Java Concurrency)(4) - 并发模型
- Java并发编程(Java Concurrency)(6) - 并发 vs. 并行(Concurrency vs. Parallelism)
- Java并发编程(Java Concurrency)(17)- 预防死锁
- Java并发编程实践评价(Java Concurrency in Practice)
- java多线程编程的好处。
- Java 编程要点之并发(Concurrency)详解
- Java 编程要点之并发(Concurrency)详解
- Java 并发 教程 - 多线程的好处
- 深入浅出java并发编程concurrency
- Java并发编程(Java Concurrency)(1)- Java并发编程简介
- java多线程(2):并发编程实践
- Java并发编程(Java Concurrency)(12)- Java 同步代码块(Java Synchronized Blocks)
- Java并发编程(Java Concurrency)(13)- Java volatile 关键字(Java Volatile Keyword)
- Java基础之---并发(Concurrency)和多线程
- Shader特效——“Distance Estimation 距离估计”的实现 【GLSL】
- Android大图片裁剪终极解决方案(下:拍照截图)
- POJ1845——Sumdiv
- VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)
- <Javascript启示录> 一书部分学习总结
- Java并发编程(Java Concurrency)(2)- 多线程的好处
- C#第一天课的内容
- Every derived table must have its own alias
- java代码操作zip文件--写入zip文件
- retrofit的应用
- 52. N-Queens II(dfs)
- gdb调试多进程、线程
- MySQL面试题1
- linux工具命令--sort