多线程的优点
原文:http://tutorials.jenkov.com/java-concurrency/benefits.html

作者:Jakob Jenkov        翻译:古圣昌            校对:欧振聪

尽管面临很多挑战,多线程有一些优点使得它一直被使用。这些优点是:

资源利用率更好
程序设计在某些情况下更简单
程序响应更快

资源利用率更好
想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要:

1 5秒读取文件A
2 2秒处理文件A
3 5秒读取文件B
4 2秒处理文件B
5 ---------------------
6 总共需要14秒
从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据。在这段时间里,CPU非常的空闲。它可以做一些别的事情。通过改变操作的顺序,就能够更好的使用CPU资源。看下面的顺序:

1 5秒读取文件A
2 5秒读取文件B + 2秒处理文件A
3 2秒处理文件B
4 ---------------------
5 总共需要12秒
CPU等待第一个文件被读取完。然后开始读取第二个文件。当第二文件在被读取的时候,CPU会去处理第一个文件。记住,在等待磁盘读取文件的时候,CPU大部分时间是空闲的。

总的说来,CPU能够在等待IO的时候做一些其他的事情。这个不一定就是磁盘IO。它也可以是网络的IO,或者用户输入。通常情况下,网络和磁盘的IO比CPU和内存的IO慢的多。

程序设计更简单
在单线程应用程序中,如果你想编写程序手动处理上面所提到的读取和处理的顺序,你必须记录每个文件读取和处理的状态。相反,你可以启动两个线程,每个线程处理一个文件的读取和操作。线程会在等待磁盘读取文件的过程中被阻塞。在等待的时候,其他的线程能够使用CPU去处理已经读取完的文件。其结果就是,磁盘总是在繁忙地读取不同的文件到内存中。这会带来磁盘和CPU利用率的提升。而且每个线程只需要记录一个文件,因此这种方式也很容易编程实现。

程序响应更快
将一个单线程应用程序变成多线程应用程序的另一个常见的目的是实现一个响应更快的应用程序。设想一个服务器应用,它在某一个端口监听进来的请求。当一个请求到来时,它去处理这个请求,然后再返回去监听。
服务器的流程如下所述:

1 while(server is active){
2    listen for request
3    process request
4 }
如果一个请求需要占用大量的时间来处理,在这段时间内新的客户端就无法发送请求给服务端。只有服务器在监听的时候,请求才能被接收。另一种设计是,监听线程把请求传递给工作者线程(worker thread),然后立刻返回去监听。而工作者线程则能够处理这个请求并发送一个回复给客户端。这种设计如下所述:

1 while(server is active){
2    listen for request
3    hand request to worker thread
4 }
这种方式,服务端线程迅速地返回去监听。因此,更多的客户端能够发送请求给服务端。这个服务也变得响应更快。

桌面应用也是同样如此。如果你点击一个按钮开始运行一个耗时的任务,这个线程既要执行任务又要更新窗口和按钮,那么在任务执行的过程中,这个应用程序看起来好像没有反应一样。相反,任务可以传递给工作者线程(word thread)。当工作者线程在繁忙地处理任务的时候,窗口线程可以自由地响应其他用户的请求。当工作者线程完成任务的时候,它发送信号给窗口线程。窗口线程便可以更新应用程序窗口,并显示任务的结果。对用户而言,这种具有工作者线程设计的程序显得响应速度更快。

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 多线程的优点

Java并发编程学习笔记(二)多线程的理解及多线程的优点相关推荐

  1. 网易云课堂微专业--Java高级开发工程师--多线程并发编程--学习笔记(二)

    文章目录 第一章 多线程并发编程 第二节 线程安全问题 1.2.1 线程安全之可见性问题 多线程中的问题 从内存结构到内存模型 工作内存缓存 指令重排序 内存模型的含义 Shared Variable ...

  2. 【并发入门】Java 并发编程学习笔记

    注:该笔记主要记录自 B站 up主 遇见狂神说的个人空间_哔哩哔哩_bilibili 1.什么是 JUC Java 工具类中的 并发编程包 学习:源码 + 官方文档 业务:普通的线程代码 Thread ...

  3. java 并发编程学习之二 ---- lock

    在Java中有两种方法实现锁机制,一种是在前一篇博客中([java7并发编程实战]-–线程同步机制:synchronized)介绍的synchronized,而另一种是比synchronized更加强 ...

  4. JAVA并发编程学习笔记之CAS操作

    http://blog.csdn.net/aesop_wubo/article/details/7537960 CAS操作 CAS是单词compare and set的缩写,意思是指在set之前先比较 ...

  5. Java并发编程学习笔记——volatile与synchronized关键字原理及使用

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. 一.vo ...

  6. JAVA并发编程学习笔记------FutureTask

    FutureTask是Future和Callable的结合体.传统的代码是这样写的 Future f = executor.submit(new Callable()); 然后通过Future来取得计 ...

  7. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  8. java并发编程学习一

    java并发编程学习一 什么是进程和线程? 进程是操作系统进行资源分配的最小单位 进程跟进程之间的资源是隔离的,同一个进程之中的线程可以共享进程的资源. 线程是进程的一个实体,是CPU 调度和分派的基 ...

  9. JAVA并发编程实践笔记

    2019独角兽企业重金招聘Python工程师标准>>> JAVA并发编程实践笔记 博客分类: java JAVA并发编程实践笔记 1, 保证线程安全的三种方法:     a, 不要跨 ...

最新文章

  1. linux驱动的入口函数module_init的加载和释放
  2. Pytorch Document学习笔记
  3. 计算机临床医学自动化哪个好,大学专业难度排行前十名,临床医学位列第二
  4. 后勤管理系统_教育信息化2.0,2019年校园智慧后勤管理系统五大品牌
  5. (线性基) bzoj 2460
  6. 课时3.浏览器访问网页原理(理解)
  7. java springmvc https_【Java Web开发学习】Spring MVC 使用HTTP信息转换器
  8. 雷军接连退出多家小米关联公司董事职务
  9. Sublime一些问题以及解决方法
  10. 数据库实验报告-实验一:SQL语言
  11. 五一成都峨眉山三日游 20140501~20140503
  12. 《SpringCloud Alibaba 微服务架构》专题(二十三)-Seat工作原理
  13. TableView的使用方法
  14. 2001年考研英语真题
  15. hbase查询性对比 mysql_查询MYSQL和查询HBASE速度比较
  16. erlang 编译安装
  17. Xilinx Alveo加速卡开发环境搭建
  18. DFT,IDFT,FFT,IFFT算法的C++实现
  19. 如何梳理OA系统功能需求
  20. ps景观平面图转鸟瞰图_用ps怎么制作鸟瞰图

热门文章

  1. 爬虫入门经典(六) | 一文带你深入了解为什么使用代理IP及其如何使用
  2. Redis实战高并发,由浅入深
  3. 舒华体育专业打造:中国东方航空企事业健身房全新升级
  4. cordova 安卓文件多选_安卓手机清理大师app下载-安卓手机清理大师下载v1.0.0安卓版...
  5. 一个可以重复遍历的RowSet
  6. 有机构给实习生开11w月薪
  7. python英文段落修改_Python小程序解决看英文文献时段落换行问题,方便翻译~
  8. 获取淘宝同款搜索API
  9. 百里峡景区内的环保卫生间
  10. s7android8国行,2000个名额!国行版三星S7系列安卓8.0内测明天上午开启