文字篇
线程概念
-
进程
- 程序在处理机的一次运行,(从代码加载,执行至完毕的一个完成过程)
-
线程
- 进程执行过程中产生的多条执行线索,比进程单位更小的执行单位。
- 它没有出口,没有入口,因此自身不能自动运行,而必须栖身于某一进程之中,有进程触发执行。
-
多线程
- java语言把线程或执行环境当作一个封装对象,包含CPU以及自己的程序代码和数据,由虚拟机提供控制。
- Thread类,创建多线程
线程结构
-
虚拟CPU
- 控制整个线程的运行
-
执行的代码
- 由Thread类控制按序执行
-
处理的数据
- 是在代码执行过程中索要处理的数据。
线程的状态
-
新建
- new Thread()
-
可运行
- 已经执行start()方法后,可使线程处在可运行状态
- 可运行但没在运行的线程都排在一个队列中,这个队列是就绪队列,
- 可运行状态中,正在运行的线程处于运行状态,等待运行的线程处于就绪状态。
-
死亡
- 当run()方法中最后一个语句执行完毕,及死亡
- 当线程遇到异常退出时便进入了死亡状态
-
阻塞
- 阻塞时线程不能进入就绪队列排队,必须要等到消除阻塞才可以重新进入队列排队
- sleep() wait()是两个常用的引起阻塞的方法
-
中断线程
-
interrupt()来终止线程,可终止处于阻塞状态或者正在运行的线程
-
测试线程是否被中中断的方法
-
void interrupt()
- 向一个线程发送一个中断请求,同时把这个线程的interrupted状态设置为true,若该线程处于blocked状态,会抛出InterruptedException异常
-
static boolean interrupted()
- 检测当前线程是否已被中断,并充值状态 interrupted值,如果连续两次调用该方法,则第二次调用将返回false
-
boolean isInterrupted()
- 检测当前线程是否已被中断,不改变状态 interrupted 值
-
-
创建线程
继承Thread类创建
-
步骤
- 从Thread类派生一个子类,在类中一定要实现run()
- 用该类创建一个对象。
- 用start()方法启动线程。
实现Runnable接口创建
- 创建一个实现Runnable()接口的类
- 用该类创建对象
- 用start()方法启动线程
创建线程两种方法的使用条件
-
使用Runnable接口方法情况
- 需要多继承的情况
-
Thread方法情况
- 单继承
- 简单不繁琐
线程的基本控制
线程启动
-
start()
- 启动线程对象,让线程从创建状态转为就绪状态
-
run()
- 用来定义线程对象被调度后所执行的操作,用户必须重写run()方法
-
yield()
- 强制终止线程执行
-
isAlive()
- 测试当前线程是否在活动
-
sleep(int millsecond)
- 使线程休眠一段时间,试驾你长短由millsecond决定,单位为ms
-
void wait()
- 是现成处于等待状态
线程调度
-
定义
- 调度通常是抢占式,抢占式调度是值可能由多个线程准备运行,但是只有一个在真正运行
-
优先级
-
优先级高的先执行
- MAX_PRIORITY = 10(最高)
- MAX_PRIOPITY = 1 (最低)
- MAX_PRIOPITY = 5 (默认)
-
每个线程创建时都会被自动分配一个优先级,默认时,继承其父类优先级
-
任务紧急的线程,其优先级较高
-
同优先级的线程 先进先出 原则
-
-
方法
-
setPriority(int newPriority)
- 重置线程优先级
-
int getPriority()
- 获得当前线程的优先级
-
static void yield()
- 暂停当前正在执行的线程,让当前线程放弃执行权
-
线程结束
-
自然死亡
- run()方法执行到最后一行
-
强迫死亡
- interrupt()方法中断线程执行
线程挂起
-
暂停一个线程 也称挂起
-
方法
-
sleep()
-
wait() / notify() / notifyAll()
- wait()方法导致当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法唤醒
-
join()
- 将引起线行线程等待,直至join()方法 调用的线程结束
-
线程互斥
何为互斥
- 同时运行的数据需要共享数据,如何保证共享数据的一致性
对象的锁定标志
-
目的
- 互斥锁来解决不同线程对共享数据操作的同步
-
实现互斥锁
- 用volatile关键词声明一个共享变量
- 用Synchronized来声明操作共享数据的一个方法或一段代码
线程同步
同步问题
- 生产者比消费者快,消费者会漏掉一些数据没有取到
- 消费者比生产者快时,消费者取相同的数据
解决问题
-
第一用来排列等待锁定标志的线程
-
第二用来实现wait()和notify()的交互机制
-
wait()作用时让当前线程释放其所持有的对象互斥锁,进入wait队列
- wait()方法只能在被声明的synchronized的方法或代码段中调用。
-
notify()/notifyAll()的作用时唤醒一个或所有正在等待队列中等待的线程,并将它们移入等待同一个对象互斥锁队列
-