1.线程概述
进程:在一个操作系统中,每一个独立执行的程序都可以称为一个进程
线程:在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,称为线程
2.线程的创建
多线程实现方式 :
①:继承·Java.lang包下的Thread类,覆写Thread类的run()方法,在run()方法中实现运行在线程上的代码
②:实现java.lang.Runnable接口,重写run()方法,在测试类创建对象并调用Thread有参构造创建线程对象再调用start方法开启线程
3.实现Runnable接口创建多线程
Runnable接口相对于Thread类的优势:
(1) 适合多个相同程序代码的线程去处理同一个资源的情况下,把线程同代码、数据有效分离,很好地体现了面向对象的思想
(2)可以避免由于java的单继承带来的局限性。在开发中经常遇到这样一种情况,即使用一个已经就继承了某一个类的子类创建线程,由于一个类不能同时有两个父类,因此不能使用继承Thread类的方式,只能采用实现Runnable接口的方式
4.线程的生命周期及状态转换
线程的五个生命周期:
新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、死亡状态(Terminated)
线程状态转换图
新建状态:创建一个线程对象后,该线程对象就处于新建状态,它此时仅仅由Java虚拟机分配了内存,没有任何线程的动态特征
就绪状态:当线程对象调用了start后,该线程就进入了就绪状态,位于线程队列中,具备运行的条件,能否获取CPU的使用权并开始运行,需等待系统的调度
运行状态:如果处于就绪状态的线程获取了CPU的使用权并开始执行run方法中的线程执行体,那该线程就处于运行状态
阻塞状态:一个正在执行的线程在某些特殊情况下,会让出CPU的使用权并暂时中止自己的执行,进入到阻塞状态
死亡状态:如果线程调用stop方法或者run方法执行完毕,又或者是线程抛出了一个未捕获的异常、错误,那该线程就进入了死亡状态
5.线程的调度
概述:Java虚拟机会按照特定的机制为程序的每一个线程分配CPU的使用权,这种机制称为线程的调度
线程调度的两种模型:分时调度模型、抢占式调度模型
分时调度模型:让所有的线程轮流获得CPU的使用权,并且平均分配每个线程占用CPU的时间片
抢占式调度模型:让运行池中优先级高的线程优先占用CPU,而对于优先级相同的线程,随机选择一个线程使其占用CPU,它失去了CPU的使用权后,再随机选择其他线程获取CPU使用权
线程的优先级:1-10,值越大优先级越高(只是获取CPU的概率增大,并不是一定能获取CPU使用权)
6.多线程同步
容易出现Bug
同步代码块的语法格式:
synchronized(lock){
操做共享资源代码块
}
同步方法的语法格式:
synchronized 返回值类型 方法名([参数1,....]) { }