当前位置: 首页 > news >正文

JAVA并发编程--1.基础概念

进程线程协程

进程

进程是一个实体。每一个进程都有它自己的地址空间,

  • 文本区域(text region)
  • 数据区域(data region)
  • 堆栈(stack region)。

文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

线程

线程,是程序执行流的最小单元。一个标准的线程

  • 线程ID,
  • 当前指令指针(PC)
  • 寄存器集合
  • 堆栈

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个 进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程 在运行中呈现出间断性。

线程的状态机

线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

协程

协程coroutine和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度,实现用户态中的切换。因此被认为更轻量,开销更低。
协程同一时间只能有一个协程运行,golang的goroutine采用的线程的方式,可能存在并行。

选型 

进程、线程、协程的关系和区别:

  • 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
  • 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
  • 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
  • CPU密集型应用
    多核的环境下,多线程可以充分利用CPU
  • IO密集型应用
    理论上协程或者NIO的处理方式较佳

线程使用

创建线程

JAVA有2种方式实现

  • 继承java.lang.Thread类
  • 实现java.lang.Runnable接口,并重写run方法

启动/暂停线程

  • thread.start()
  • thread.stop()

互斥

使用synchronized关键字声明的方法,会在线程间进行同步。可以视为不同线程竞争一把锁。当线程运行时加锁,结束运行或异常退出时释放

中断

调用thread.interrupt()方法让线程进入中断interrupted状态,可通过调用isInterrupted来确认是否进入中断状态

等待/唤醒

调用thread.wait()方法让线程进入等待状态,进入此状态的线程可被其他线程的notify()/notifyAll()方法唤醒继续执行下文,也可被interrupt()进入中断
如果执行wait时指定了时间。那么当计时器到达指定时间后,如果没有被notify唤醒,该线程也会被唤醒。

状态机图例

图片描述

相关文章:

  • Amino—结构层
  • 使用双拼的好处
  • swift开发常用代码片段
  • 五分钟了解身体作息规律
  • jzoj6003. 【THUWC2019模拟2019.1.16】Square (乱搞)
  • MongoDB 之pymongodb
  • Web安全小攻略 | Web高能短文系列
  • 淘淘商城的一些错误
  • SpringBoot2.x升级后的变化
  • 算法学习心得
  • 利用Python讲多张图片合成PDF文件
  • Apache Beam实战指南 | 玩转大数据存储HDFSIO
  • 记一次面试题——call、apply、bind模拟实现的更好方式
  • 逻辑运算符
  • 古郡敦煌迎新年初雪 雪漠风光引游人
  • Google 是如何开发 Web 框架的
  • [译] 怎样写一个基础的编译器
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • es6(二):字符串的扩展
  • HTTP 简介
  • JavaScript 奇技淫巧
  • magento 货币换算
  • SpiderData 2019年2月25日 DApp数据排行榜
  • spring boot下thymeleaf全局静态变量配置
  • webpack+react项目初体验——记录我的webpack环境配置
  • 闭包--闭包之tab栏切换(四)
  • 产品三维模型在线预览
  • 记一次删除Git记录中的大文件的过程
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微信小程序填坑清单
  • 《天龙八部3D》Unity技术方案揭秘
  • Mac 上flink的安装与启动
  • python最赚钱的4个方向,你最心动的是哪个?
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​比特币大跌的 2 个原因
  • # centos7下FFmpeg环境部署记录
  • $forceUpdate()函数
  • (09)Hive——CTE 公共表达式
  • (31)对象的克隆
  • (day6) 319. 灯泡开关
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)一些感悟
  • (转载)利用webkit抓取动态网页和链接
  • .net Application的目录
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .Net 应用中使用dot trace进行性能诊断
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • @GetMapping和@RequestMapping的区别