如果不考虑多线程的话,那么在程序只有一条执行路径,代码串行执行:顺序执行、选择或者循环。单线程就像你用你惯常的手去写字,多线程编程就要求你左手画圆,右手画方。一不留神就会手忙脚乱,圆不是圆,方也不像方。在继续学习多线程编程之前,先来小小的回顾一下操作系统的进化史。

操作系统发展回顾

手工操作:计算机并不包含操作系统,从头到尾只执行一个程序,这个程序可以访问程序中所有的资源。

批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。

多道程序设计技术:
所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行。即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。

分时系统:
由于CPU速度不断提高和采用分时技术,一台计算机可同时连接多个用户终端,而每个用户可在自己的终端上联机使用计算机,好象自己独占机器一样。

从操作系统的发展可以看出来,从单任务到多任务,从多道处理到分时处理,计算机的资源利用率和并发性越来越高了。

在早期的分时系统中,每个进程相当于一台虚拟的冯·诺依曼计算机,它拥有存储指令和数据的内存空间,根据机器语言的语义以串行的方式执行指令,并通过一组I/O指令与外部设备通信。

这个时候如果把一个进程当做虚拟机,那么这个进程中的线程就相当于虚拟机中的进程啦。

串行编程的好处在于直观和简单,不容易出岔子,缺点是如果某些步骤处理时间过长需要无谓的等待;

异步处理的好处是:高效,充分利用资源,缺点各个步骤之间需要协调一致,不然容易乱套。

结论:分时,多进程、多线程的并发、异步执行,这些复杂的编程手段已经成熟了,需要我们更好地掌握以提高自己的编程水平。

多线程的优势

1. 发挥处理器的强大能力

在多处理器上,多线程可以通过提高处理器资源的利用率来提高系统的吞吐率。

在单处理器系统上也可以获得更高的吞吐率,比如说多线程程序在等待某个同步I/O操作时,还有其他线程可以继续运行。

2. 建模的简单性

完成单任务时,很简单,只要把这件事做好就行。但是在完成多任务的时候,不仅要把活干好,还要考虑不同任务之间存在优先级和时间。

3. 异步事件的简化处理

一部分线程接受客户端请求,另一部分处理器请求。如果是单线程程序的话,处理请求时会停顿导致接受请求阻塞,为了避免这个问题单线程程序必须使用非阻塞的I/O,这种I/O的复杂性要远远高于同步I/O。

4. 响应灵敏的用户界面

这个就不解释了。

多线程的例子

如果使用得当,线程可以有效地降低程序的开发和维护成本,同时提升复杂应用程序的性能。

这里列举几个多线程的应用场景,帮助加深理解。

1. 图形用户界面中,多线程可以提供用户界面响应灵敏度。

2. 服务器应用程序中,可以提升资源利用率以及系统吞吐率。比如在tomcat中一部分线程接受请求,另一部分线程处理请求。

3. JVM垃圾收集器中,垃圾收集通常在一个或者多个专门的线程中运行,同时还有个主线程来运行main方法。

4. 矩阵计算,多线程并发执行。

5. 下载大文件时,大文件可以分成多个部分,每个线程下载一部分。

6. 多叉树中搜索N个文件。

7. 假设有个请求,这个请求服务端的处理需要执行3个很缓慢的IO操作(比如数据库查询或文件查询)。

8. web服务器本身;各种专用服务器(如游戏服务器)。

9. 后台任务,例如:定时向大量(100w以上)的用户发送邮件。

10.
异步处理,例如:发微博、记录日志等。

11.
分布式计算。

12. 生产者和消费者模型。

13. 定时任务。

14. Servlet和JSP,多并发时可能有多个客户端请求Servlet,Servlet必须是线程安全的。

15. 远程方法调用。

Java并发编程(二)为什么需要多线程的更多相关文章

  1. Java并发编程二三事

    Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...

  2. 【Java并发编程二】同步容器和并发容器

    一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并 ...

  3. Java 并发编程(二):如何保证共享变量的原子性?

    线程安全性是我们在进行 Java 并发编程的时候必须要先考虑清楚的一个问题.这个类在单线程环境下是没有问题的,那么我们就能确保它在多线程并发的情况下表现出正确的行为吗? 我这个人,在没有副业之前,一心 ...

  4. Java并发编程(一)-- 多线程的基本概念

    多线程发展进程 在过去单CPU时代,单任务在一个时间点只能执行单一程序:发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程--虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 ...

  5. 【Java并发编程二】Java并发包

    1.Java容器 1.1.同步容器 Vector ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时 ...

  6. Java并发编程 (二) 并发基础

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.CPU多级缓存-缓存一致性 1.CPU多级缓存 ​ 上图展示的是CPU高级缓存的配置,数据的读取和存 ...

  7. java并发编程系列一、多线程

    一.什么是线程 一个应用就是一个进程.一个进程由多个线程组成.一个生产车间比作是一个进程.工人比作是线程.当任务比较多的时候,增加工人可以提高效率,同时成本就是支付费用(机器资源,内存)也会增加. p ...

  8. java并发编程(八)多线程环境下安全使用集合

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17200509     在集合API中,最初设计的Vector和Hashtable是多线程安 ...

  9. 转:【Java并发编程】之八:多线程环境中安全使用集合API(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17200509     在集合API中,最初设计的Vector和Hashtable是多线程安 ...

  10. Java并发编程(三)-- 多线程的“问题”

    竞态条件与临界区 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源.当多个线程同时访问同一个资源,并且其中的一个或者多个线程对这个资源进行了写操作,才会产生竞态条件.多个线程 ...

随机推荐

  1. RequireJS 2.0初探

    就在前天晚上RequireJS发布了一个大版本,直接从version1.0.8升级到了2.0.随后的几小时James Burke又迅速的将版本调整为2.0.1,当然其配套的打包压缩工具r.js也同时升 ...

  2. Bean实例化(三种方法)

    (一)构造器实例化Bean 1. Bean1.java package com.inspur.ioc; public class Bean1 { } 2.Beans1.xml <?xml ver ...

  3. opencv在vc2010 express下环境搭建方法笔记+空白通用工程(已编译测试通过)(提供下载)

    opencv在VC2010 express版本下的环境搭建可以参见下面的wiki,这里面讲的非常清楚. http://wiki.opencv.org.cn/index.php/VC_2010_Expr ...

  4. C语言 printf格式化输出,参数详解

      有关输出对齐 int main(int argc, char* argv[]){ char insertTime[20] = {"1234567890"}; double in ...

  5. WebService authentication

    http://blog.csdn.net/largestone_187/article/details/5734632 通过SoapHeader对用户口令进行验证,只有授权的用户才可以使用接口.确保了 ...

  6. Android Studio使用过程中Java类突然报红,但项目可运行解决方案

    1.点击File->Invalidate Caches / Restart... 2.重启Gradle,清除缓存 3.Clean Project

  7. openstack如何设置cpu和内存的超配比例

    默认OpenStack的CPU超配比例是1:16,内存超配比例是1:1.5.下面配置的就是这个比例,你可以自己算一下,cat /proc/cpuinfo里面的逻辑核数,再x16就是你能够分配给虚拟机的 ...

  8. 小二助手-react.js分块加载

    小二助手在线演示地址:http://118.25.217.253:8000  账号test 密码123 小二助手是用material-ui开发的,感觉国内使用的人数不是特别多,所以创建了一个qq交流群 ...

  9. nginx linux 安装

    nginx linux 安装 进入http://nginx.org/en/download.html 下载 n  gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gc ...

  10. mysql增量备份(2/2)

    前言 这是在百度文库里看到的文章,原名叫做<MYSQL 完全与增量备份及恢复文档 >,是关于完全备份和增量备份以及恢复文档的...... 文档介绍 本文档采用 mysqldump  对数据 ...