multithreading基础知识
概念
OS、程序、进程、线程
- 操作系统 ( Operation System )
- 应用程序 ( application )
- 进程 ( process ):进程是最小的系统资源分配单位
- 线程 ( thread ):轻量级的进程,一个进程内部可以有多个线程,线程是最小的执行单位
调度方式
- 协作式
- 抢占式
并发
- 在极短的某个时间段内,多个程序都完成了从启动到执行完毕的过程,并且都在同一个CPU中执行
- 单核单线程的CPU中同一时刻只能执行一个任务
并行
- 在多个CPU中同时执行多个程序,他们都完成了从启动到执行完毕的过程
执行线程
当前线程
- 通过调用 Thread.currentThread() 来获取当前 执行线程 的引用
- 那个线程调用了 currentThread 方法就返回那个线程
Thread类
- 在Java语言中与正在运行的线程对等被称作 执行线程
- 表示 执行线程 的 Java 对象 的类型一定是 java.lang.Thread 类型
创建方式
-
继承Thread类
- Step 1 : 自定义一个继承Thread类并重写其run()方法的类
- Step 2 : 创建 Thread实例 ( 即创建Thread子类的实例 )
- Step 2 : 调用 Thread实例 的 start() 方法启动线程
-
实现Runnable接口
- Step 1 : 自定义一个实现Runnable接口并实现其run()方法的类
- Step 2 : 创建 Runnable实现类 的实例
- Step 3 : 创建 Thread实例 ( 将Runnable实例传递给Thread实例 )
- Step 4 : 调用 Thread实例 的 start() 方法启动线程
-
利用线程池实现
-
Step 1 : 创建线程池
-
Step 2 : 创建任务
- 通过创建 Runnable实现类 的实例来创建线程任务
- 通过创建 Callable实现类 的实例来创建线程任务
-
Step 3 : 提交任务
-
Step 4 : 关闭线程池
-
main 线程
- 含有 public static void main( String[ ] ) 的类就是启动类
- 运行启动类时,JVM会创建并启动一个名称是 main 的线程
- main 线程会调用 启动类 的main方法 (因此main方法必须是类方法)
线程状态
新建状态
就绪状态
运行状态
阻塞状态
死亡状态
线程调度
线程优先级
-
优先级
- Thread.MIN_PRIORITY
- Thread.NORM_PRIORITY
- Thread.MAX_PRIORITY
-
获取优先级
- thread.getPriority()
-
设置优先级
- thread.setPriority( priority )
线程睡眠
-
通过调用Thread类的类方法实现
- Thread.sleep( millis )
-
那个线程调用了 Thread类的 sleep 方法就导致那个线程睡眠
-
睡眠是阻塞状态(可以被中断)
-
Thread 类中的 sleep 方法是 【类方法】
线程让位
-
通过调用Thread类的类方法实现
- Thread.yield()
-
yield导致当前执行线程释放CPU让位给优先级大于等于当前线程优先级的线程
-
Thread 类中的 yield 方法是 【类方法】
线程插队
- 一个线程等待另一个线程执行完毕再执行其后续操作
- 设 x 线程调用了 y 线程的 join 方法,则 x 线程会等待 y 线程执行结束后再执行后续操作
- Thread 类中的 join 方法是 【实例方法】
线程中断
- 一个线程可以中断另一个线程的某种阻塞状态
- 设 x 线程处于睡眠中,当 y 线程调用 x 的 interrupt 方法时就会中断 x 线程的睡眠
- Thread 类中的 interrupt 方法是 【实例方法】
守护线程
- 守护线程 也称作 精灵线程 或 后台线程
- 非守护线程 也称作 前台线程 或 用户线程
- 精灵线程 负责 守护 前台线程 的运行
- 通过 Thread类中的实例方法 isDaemon 可以判断一个线程是否是守护线程
- 通过 Thread类中的实例方法 setDaemon 可以将一个线程设置为守护线程
- 所有的 守护线程 创建的 新线程 默认都是 守护线程
- 所有的 非守护线程 创建的 新线程 默认都是 非守护线程
线程同步
同步
-
同步绝对不是同时发生(或同时执行)
-
同步应该理解为 协作运行 ( 多个线程安装约定的顺序依次执行 )
-
实现方式
- 临界区
- 互斥对象
- 信号量
- 事件对象
-
互斥可以看作是一种特殊的同步
同步锁
- 多个线程竞争的对象就是同步锁
- 同步锁在有些资料上也称作 监视器(monitor) 或 对象监视器
同步代码块
- synchronized( 同步锁 ) {
// 同步代码块
}
同步方法
- 被 synchronized 修饰的方法就是 同步方法
- 对于 synchronized 修饰的【类方法】来说,其同步锁就是 当前类对应的 Classs实例
- 对于 synchronized 修饰的【实例方法】来说,其同步锁就是 当前对象 (this)