Java并发(二)多线程的好处
即使编写多线程程序具有挑战性,但它仍在使用中,是因为它可以带来如下的好处:
- 更好的资源利用
- 在某些场景下程序的设计会更简单
- 提升程序的响应性
更好的资源利用
假设一个应用会从本地文件系统中读取和处理文件。我们假设从磁盘上读取一个文件花费5秒钟并且处理它会花费2秒钟。那么处理两个文件会花费:
seconds reading file A
seconds processing file A
seconds reading file B
seconds processing file B
-----------------------
seconds total
从磁盘上读取文件的时候,大多数的CPU时间都会花费在等待磁盘来读取数据。在这个时候CPU是相当空闲的。在这个时候它可以干点别的事情。通过改变操作的顺序,CPU可以得到更好的利用。看一下下面的这种操作顺序:
seconds reading file A
seconds reading file B + seconds processing file A
seconds processing file B
-----------------------
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
}
这种情况下,服务器线程会更快地监听请求。就有更多地客户端可以向服务器发送请求。服务器因此而更具有响应性。
对于桌面应用也是这样的。如果你点击一个按钮开启一个耗时很长的任务,并且执行任务的线程同时也是更新窗口,按钮等的线程,那么应用会在处理任务的时候表现得响应性很差。其实可以把任务交给后台的线程。当后台线程繁忙地处理任务地时候,窗口线程可以继续响应用户其他地请求。当工作线程把任务处理完毕之后,可以给窗口线程发送信号。这时,窗口线程可以根据任务处理的结果来更新应用窗口。采用后台线程程序可以对用户表现得更具有更好得响应。
Java并发(二)多线程的好处的更多相关文章
- Java并发与多线程教程(2)
Java同步块 Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) ...
- Java并发与多线程教程(1)
Java并发性与多线程介绍 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是多个任务 ...
- java并发与多线程面试题与问题集合
http://www.importnew.com/12773.html https://blog.csdn.net/u011163372/article/details/73995897 ...
- Java并发和多线程(一)基础知识
1.java线程状态 Java中的线程可以处于下列状态之一: NEW: 至今尚未启动的线程处于这种状态. RUNNABLE: 正在 Java 虚拟机中执行的线程处于这种状态. BLOCKED: 受阻塞 ...
- Java 并发和多线程(一) Java并发性和多线程介绍[转]
作者:Jakob Jenkov 译者:Simon-SZ 校对:方腾飞 http://tutorials.jenkov.com/java-concurrency/index.html 在过去单CPU时 ...
- Java并发和多线程:序
近期,和不少公司的"大牛"聊了聊,当中非常多是关于"并发和多线程"."系统架构"."分布式"等方面内容的.不少问题, ...
- Java并发和多线程2:3种方式实现数组求和
本篇演示3个数组求和的例子. 例子1:单线程例子2:多线程,同步求和(如果没有计算完成,会阻塞)例子3:多线程,异步求和(先累加已经完成的计算结果) 例子1-代码 package cn.fansuni ...
- Java并发和多线程1:并发框架基本示例
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括ThreadPool,Executor,Executors,ExecutorService,Com ...
- Java并发(二):基础概念
并发编程的第二部分,先来谈谈发布(Publish)与逸出(Escape); 发布是指:对象能够在当前作用域之外的代码中使用,例如:将对象的引用传递到其他类的方法中,对象的引用保存在其他类可以访问的地方 ...
- Java并发和多线程3:线程调度和有条件取消调度
在第1篇中"并发框架基本示例",提到了Executors和ThreadPool.其中,还有个"定时调度"的方法,Executors.newScheduledTh ...
随机推荐
- WinForm如何调用Web Service
参考地址 今天看了李天平关于WinForm调用Web Service的代码,我自己模仿做一个代码基本都是复制粘贴的,结果不好使.郁闷的是,又碰到那个该死的GET调用Web Service,我想肯定又是 ...
- Eclipse Xml编译错误Referenced file contains errors - spring-beans-4.0.xsd
本文转自:http://josh-persistence.iteye.com/blog/2125420 在eclipse中,有时候在xml文件中,特别是于Spring相关的配置文件中,会出现一些不影响 ...
- Total Commander:文件管理工具,共享软件
http://xbeta.info/tc/ Total Commander V8.0:文件管理工具,共享软件,适用于Windows® 95/98/ME/NT/2000/XP/Vista/7 和 Win ...
- java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 1
String sql1 = "insert into TEST_RELEVANCEEXPORT" + " (ID, YYCSDM, YYCSMC, ...
- JMeter学习笔记---作用域规则
JMeter测试树中既包含遵循分层规则的测试元件(监听器.配置元件.后置处理器.前置处理器.断言.定时器),又包含遵循顺序规则的测试元件(逻辑控制器.采样器),测试人员创建测试计划的同时,实际上就创建 ...
- Android手机在不同分辨率情况下字体自适应大小
两种解决方法: 一. 1.首先根据不同分辨率获取不同字体大小. 在RES里创建values-480x320/strings.xml 里面设置<dimen name="Text_size ...
- Bridge - 桥接模式
1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...
- mysql-5.7 show engine innodb status 详解
一.show engine innodb status 简介: show engine innodb status 是mysql提供的一个用于查看innodb引擎时间信息的工具,就目前来说有两处比较 ...
- jdbc连接hive0.14
Jdbc连接hive0.14版本号 眼下官网最新版本号是hive0.13,要想下载最新的hive得去git上去clone一个. Hive0.14最大特点是支持直接插入. 如今做一个jdbc连接hive ...
- keepalived openssl 报错
configure: error: !!! OpenSSL is not properly installed on your system. !!! !!! Can not include Open ...