1.为什么开发中需要并发编程?
(1)
加快响应用户的时间
(2)
使你的代码模块化
,
异步化
,
简单化
(3)
充分利用
CPU
的资源
2. 基础概念
2.1 进程
进程就可以视为程序的一个实例
站在操作系统的角度, 进程是程序运行资源分配(以内存为主)的最小单位。
2.2 线程
线程必须依赖于进程而存在,线程是进程中的一个实体,是
CPU
调度和分 派的基本单位,它是比
进程更小的、能独立运行的基本单位。
线程则是
CPU
调度的最小单位
2.3 CPU 核心数和线程数的关系
CPU
内核和同时运行的线程数 是
1:1
的关系
Intel
引入 超线程技术后,产生了逻辑处理器的概念, 使核心数与线程数形成 1:2
的关系
2.4上下文切换(Context switch)
既然操作系统要在多个进程(线程) 之间进行调度, 而每个线程在使用
CPU
时总是要使用
CPU
中的资源,比如
CPU
寄存器和程序计数器
3.Java中的并发
3.1 线程
3.1.1线程的启动
1 .
继承Thread接口,调用start方法
2. 实现Runnable接口
;然后交给
Thread 调用start方法
3.1.2线程的终止
1.线程自然终止
要么是
run
执行完成了,要么是抛出了一个未处理的异常导致线程提前结束
2.
stop
暂停、恢复和停止操作对应在线程
Thread
的
API
就是
suspend()
、
resume()
和
stop()
。但是这些 API 是过期的,也就是不建议使用的。
3.
中断
不建议自定义一个取消标志位来中止线程的运行
一、一般的阻塞方法,如
sleep
等本身就支持中断的检查,
二、检查中断位的状态和检查取消标志位没什么区别, 用中断位的状态还可 以避免声明取消标志
位,减少资源的消耗。
注意:处于死锁状态的线程无法被中断
3.1.3 线程的状态
Java
中线程的状态分为
6
种:
1.
初始
(NEW)
:新创建了一个线程对象,但还没有调用
start()
方法。
2.
运行
(RUNNABLE)
:
Java
线程中将就绪(
ready
)和运行中(
running
)两种 状态笼统的称为“运
行”。
线程对象创建后,其他线程
(
比如
main
线程)调用了该对象的
start()
方法。 该状态的线程位于可
运行线程池中, 等待被线程调度选中, 获取
CPU
的使用权, 此时处于就绪状态(
ready
)。就绪状
态的线程在获得
CPU
时间片后变为运行中 状态(
running
)。
3.
阻塞
(BLOCKED)
:表示线程阻塞于锁。
4.
等待
(WAITING)
:进入该状态的线程需要等待其他线程做出一些特定动作 (通知或中断)。
5.
超时等待
(TIMED_WAITING)
:该状态不同于
WAITING
,它可以在指定的时 间后自行返回。
6.
终止
(TERMINATED)
:表示该线程已经执行完毕。
3.1.4线程的优先级
在
Java
线程中, 通过一个整型成员变量
priority
来控制优先级, 优先级的范 围从
1~10
,在线
程构建的时候可以通过
setPriority(int)
方法来修改优先级,默认 优先级是
5
,优先级高的线程分配时
间片的数量要多于优先级低的线程。