一谈到Java并发编程,我们一般就会联想起进程、线程、并行、并发等等概念。那么这些概念都代表什么呢?进程与线程有什么关系?并发与并行又是什么关系呢?

01

进程与线程

进程是指程序的一次动态执行过程,通常我们说计算机中正在执行的程序就是进程,每个程序都会对应着一个进程。一个进程包含了从代码加载到执行完成的一个完整过程,它是操作系统资源分配最小单元。

而线程则是比进程更小的执行单位,是CPU调度和分派的基本单位。每个进程至少有一个线程,反过来一个线程只能属于一个进程,线程可以对进程所有的资源进行调度和运算。线程既可以由操作系统内核来控制调度,也可以由用户程序进行控制调度。

根据下图可以看到,多个CPU会去执行这三个进程。其中每个进程都包含着至少一个线程,比如进程1包含了四个线程,进程2和进程3包含一个线程。此外,每个进程都有自己的资源,而进程内的所有线程都共享进程包含的资源。

02

并发与并行

并发和并行都可以是相对于进程或是线程来说。并发是指一个或若干个CPU对多个进程或线程之间进行多路复用,用简单的语言来说就是CPU轮着执行多个任务,每个任务都执行一小段时间,从宏观上看起来就像是全部任务都在同时执行一样。并行则是指多个进程或线程同一时刻被执行,这是真正意义上的同时执行,它必须要有多个CPU的支持。如下图是并发和并行的执行时间图。对于并发来说,线程一线执行一段时间,然后线程二再执行一段时间,接着线程三再执行一段时间。每个线程都轮流得到CPU的执行时间,这种情况下只需要一个CPU即能够实现。对于并行来说,线程一、线程二和线程三是同时执行的,这种情况下需要三个CPU才能实现。并发和并行都提升了CPU的资源利用率。

而对于Java并发,就是在Java平台上实现来实现并发机制,Java平台上提供了线程以及线程并发

03

多线程能提高执行效率

前面我们了解到多线程可以实现并发和并行执行,所以多线程能提升总体的效率。如果不支持多线程的话,那么当某个执行任务进入等待阻塞状态时,则可能因为阻塞而导致运行效率低下。如下图一中,一个请求任务发起请求后则开始等待响应,此时该线程占着CPU又不干活,从整个运行线上可以看到真正运行(绿色方块)的时间很少,这就是运行效率低下。但在如果支持多线程并发的情况下,则可以在等待阻塞时去干其它的活。此外,多CPU环境下,如果一个任务能够分解成多个小任务,那么就能够用多个CPU同时执行它,这样就能以更加快的速度完成任务,毕竟单个CPU运行能力有限。如下图二中,一旦将任务分解成三个小任务后,在多CPU环境下则能够并行执行,大大减少了整体执行时间。

单线程阻塞状态

多线程并行

04

多线程能提升用户体验

多线程也能提升用户体验,如果一个线程的任务既包含耗时的任务又包含用户交互的任务,那么则可能会导致用户体验很糟糕。如下图,假如大家看到这些窗口一直在打转又无法对其进行操作,是不是很难受?一个线程发起请求后开始等待请求结果,用户界面则一直卡着没响应。我们可以通过多线程将任务分为请求任务和界面操作两部分,这样就能在请求后保持对界面操作的响应,以便提供更好的用户体验。

05

多线程让编码更难

天下没有免费的午餐,多线程也是需要付出代价的。从编写代码的角度来看,多线程使得编码变得更加复杂,本质上这是因为多线程机制与现代计算机结构所带来的。纵使在编程语言设计专家的努力下,现在有很多简化多线程编程的语言和模型,但相比于单线程来说多线程的编写仍然复杂很多。数据从主存储到CPU中间有若干层缓存和寄存器,而且多个线程可能访问共享内存,这就涉及到数据同步问题,从而增加了多线程编程的复杂性。此外,线程与线程之间的通信也比较麻烦,这也增加了多线程编码的复杂性。总之,尽管很多编程语言尝试为我们提供更便捷的多线程编程,但在语言层面仍然无法完全屏蔽掉多线程与计算机结构的复杂性,所以不管我们使用什么语言都需要为多线程的编码考虑得更多。

06

上下文切换与资源开销

多线程除了增加编码难度外,它还在执行过程中带来实际的损耗,包括资源开销和上下文切换开销。资源开销主要包括其本身占用的内存资源、执行时线程本地栈开销以及对这些线程进行管理的开销。而上下文切换开销则是因为CPU由一个线程切换到另外一个线程是需要做现场保护和现场恢复工作,包括线程标识、寄存器内存、线程状态、线程优先级、线程资源清单等等。如下图所示,假设线程一和线程二由某个CPU执行。线程一执行一段时间后将相关信息保存到现场数据结构中,而线程数据结构存放在主存储中,然后从线程二对应的现场数据结构中恢复线程二相关信息,完成现场恢复后线程二开始执行。接下去的过程反过来,由线程二切换到线程一。其中可以看到由虚线分割的两部分被标为切换开销,从完整的时序来看,这两部分并非执行线程的任务,而是消耗在了现场的保护和恢复上了,这便是上下文切换的开销。

上下文切换

在实践中我们要综合考虑多线程的优缺点,不能一味的去追求多线程,在使用多线程之前我们必须去衡量多线程带来的好处与代价。

Java并发编程:进程、线程、并行与并发相关推荐

  1. HIT软件构造 第十章 并发编程 进程 线程 线程安全

    名词解释 进程(Process)和线程(thread):并发编程的两个基本单元.进程:(1)和同一个机器上的其他进程是彼此隔离的.(2)拥有私有的内存空间,运行时不能共享变量.(3)通过IPC(pip ...

  2. 并发编程-14线程安全策略之并发容器(J.U.C)中的集合类

    文章目录 J.U.C总览 脑图 概述 并发容器特性 示例 ArrayList对应的线程安全的并发容器类CopyOnWriteArrayList (线程安全) HashSet对应的线程安全的并发容器类C ...

  3. python多线程执行其他模块的文件_python并发编程--进程线程--其他模块-从菜鸟到老鸟(三)...

    concurrent模块 1.concurrent模块的介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 Proc ...

  4. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  5. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  6. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  7. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

  8. Java并发编程:线程的同步

    <?xml version="1.0" encoding="utf-8"?> Java并发编程:线程的同步 Java并发编程:线程的同步 Table ...

  9. Python 并发编程--进程,线程,协程

    并发编程 基本概念的区分: 并发 只有一个CPU,多个程序在一个CPU上轮流执行,宏观上多个进程并发执行,但微观上依旧是串行 并行 有多个CPU,多个程序在多个CPU上同时执行. 进程 计算机中最小的 ...

  10. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

最新文章

  1. java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题
  2. python使用符号 标示注释-第一章:Python语言程序设计
  3. python etl 大猩猩_Airflow教程-使用Airflow实现ETL调度
  4. C指针原理(24)-C指针基础
  5. hikaricp 连接池分析_数据库连接池终于搞对了,这次直接从100ms优化到3ms!
  6. 【转】为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?...
  7. 微软Edge扩展工具箱旨在将Chrome扩展带至Edge
  8. java添加事件监听器_Java事件监听器的四种实现方式
  9. 区域转换为二值图像_零基础一文读懂AI深度学习图像识别
  10. oracle votedisk ocr,Oracle RAC 重建OCR和Votedisk
  11. 20165218 《网络对抗技术》Exp0 Kali安装 Week1
  12. 02年计算机学院成立,教育部关于成立2002年-2006年教育部高等学校外语专业等科类教学指导委员会的通知...
  13. 计算机学科 集体备课记录,信息技术学科组集体备课活动记录
  14. H5调用摄像头拍照保存到服务器再把路径存到数据库中
  15. 四十一、SPSS中的t检验和卡方检验
  16. .博弈论之Best Response
  17. 记一个git checkout问题error: invalid path
  18. 第九周项目六 委派任务
  19. 关于用python实现Windows笔记本自动切换强信号WiFi功能
  20. magisk安装失败_联想Z6 Pro安卓10刷Magisk、太极

热门文章

  1. 北京微信小程序管理公众开放平台
  2. 亚洲护照实力进一步加强
  3. 基于Matlab使用艾伦方差来确定MEMS陀螺仪的噪声参数(附源码)
  4. Android touch bringup
  5. 设置多个div横向排列
  6. 控制网络技术(英文一)
  7. ESL3.2(下)最小二乘法学习笔记(含施密特正交化,QR分解)
  8. 虚拟机简单安装centos7
  9. 素数(质数)判断、打印素数表(Eratosthenes筛法)、质因子分解————附完整代码
  10. 零基础如何自学网络安全?网络安全培训的课程大纲