Java高并发和多线程系列 - 1. 线程基本概念
1. 什么是线程? 线程和进程的区别
在了解线程的概念前,我们应该先知道什么是进程?
进程是操作系统的基本概念之一, 它是正在执行的程序实例。
* 下面的一些进程的基本概念你可以了解下
--------------------------------------------------------------------
操作系统逻辑上将一个进程分为以下几部分(段):
# 文本
程序的指令
# 数据
程序使用的静态变量
# 堆
程序可从该区域动态分配额外内存
# 栈
随函数调用和返回而增减的一片内存, 用于为局部变量和函数调用链接信息分配存储空间
--------------------------------------------------------------------
那么,什么是线程呢?
线程是程序执行的最小单位。
我们可以把线程看做是轻量级的进程。
使用多线程而不是多进程去进行并发程序的设计,是因为线程间的切换和调度成本要远远小于进程。
2. 线程的生命周期和各个状态
NEW(新生)
线程刚被新建好之后,进入 NEW(新生)状态
这个时候线程还没开始执行
RUNNABLE(运行)
当线程的start()方法调用时, 才表示线程开始执行。
BLOCKED(阻塞)
如果线程在执行的过程中遇到了synchronized同步块, 就会进入
BLOCKED(阻塞)状态, 这时线程会暂停执行,知道获得请求的锁。
WAITING / TIMED_WAITING
这两个状态都是线程进入等待状态
区别是: WAITING(无时间限制) / TIMED_WAITING(有时间限制)
wait()方法会让线程进入等待队列
notify()方法会在等待队列中将线程唤醒
join()方法让线程进入等待队列,等目标线程终止
TERMINATED(终止)
当线程执行完毕后,则进入TERMINATED(终止)状态
Java高并发和多线程系列 - 1. 线程基本概念的更多相关文章
- Java高并发与多线程(二)-----线程的实现方式
今天,我们开始Java高并发与多线程的第二篇,线程的实现方式. 通常来讲,线程有三种基础实现方式,一种是继承Thread类,一种是实现Runnable接口,还有一种是实现Callable接口,当然,如 ...
- Java高并发与多线程(三)-----线程的基本属性和主要方法
今天,我们开始Java高并发与多线程的第三篇,线程的基本属性和主要方法. [属性] 编号(ID) 类型long 用于标识不同的线程,编号唯一,只存在java虚拟机的一次运行 名称(Name) 类型St ...
- Java高并发与多线程(四)-----锁
今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...
- java高并发核心要点|系列文章
java高并发核心要点|系列1|开篇 java高并发核心要点|系列2|锁的底层实现原理 java高并发核心要点|系列3|锁的底层实现原理|ABA问题 java高并发核心要点|系列4|CPU内存指令重排 ...
- java高并发核心要点|系列1|开篇
在java高并发编程,有几个很重要的内容: 1.CAS算法 2.CPU重排序 3.缓存行伪共享 我们先来说说高并发世界中的主要关键问题是什么? 是数据共享. 因为多线程之间要共享数据,就会遇到各种问题 ...
- Java高并发与多线程(一)-----概念
其实之前一直想专门写一篇,单独说一说Java的多线程与高并发,但是一直以来,都没有想到能够用什么比较有趣的表现形式去表达出来,而且网上充斥着很多类似的博客,有好的又不好的,有简介的有繁琐的,所以也一直 ...
- 【实战Java高并发程序设计 7】让线程之间互相帮助--SynchronousQueue的实现
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
- java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)
今天,我们来学习另一个重要的概念. CPU内存指令重排序(Memory Reordering) 什么叫重排序? 重排序的背景 我们知道现代CPU的主频越来越高,与cache的交互次数也越来越多.当CP ...
- java高并发编程(五)线程池
摘自马士兵java并发编程 一.认识Executor.ExecutorService.Callable.Executors /** * 认识Executor */ package yxxy.c_026 ...
随机推荐
- PAT (Basic Level) Practise - 我要通过!
“答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1 ...
- day29 网络编程
网络通信原理: http://www.cnblogs.com/linhaifeng/articles/5937962.html 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络 ...
- Ubuntu ssh-keygen 生成公钥并添加到远程服务器上
1. 在本地生成公钥, ssh-keygen -t RSA -b 800 2. cd /root/.ssh 3. ssh-copy-id -i id_rsa.pub 远程服务器IP 这一步需要输入远 ...
- MySQL数据库基本用法-聚合-分组
聚合 为了快速得到统计数据,提供了5个聚合函数 count(*)表示计算总行数,括号中写星与列名,结果是相同的 查询学生总数 select count(*) from students; max(列) ...
- 2019-1-11 SQL语句汇总——聚合函数、分组、子查询及组合查询
- 2153 ACM 仙人球的残影 输出格式
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2153 中文题目,很简单,但是要注意输出格式,题目中三个字符长度 输出格式:%3d (整数) 思路:将输出看 ...
- (Android系统目录结构)/mnt/sdcard 和 sdcard 的区别
mnt/是Unix/Linux系统下外部设备的专用目录,Linux默认挂载外部设备都会挂载到这个目录;如将SD卡挂载后,会生成目录:/mnt/sdcard/. shell@aeon6735m_65c_ ...
- 潭州课堂25班:Ph201805201 第一课:环境搭建 (课堂笔记)
安装PyCharm ,Oracle VM VirtualBox,Xshell ,实现仿真远程连接服务器,其中Oracle VM VirtualBox用于那家linux服务器,Xshell 用于连接服务 ...
- 修改HAL标准库用printf函数发送数据直接输出
主函数文件,请直接关注自己写上去的代码: 直接看43行代码:#include "stdio.h"//要添加这个头文件 还有97行到112行:实现用HAL库函数和printf函数发送 ...
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...