Java - 多线程
> 线程的两种实现方式:
> 继承(extends) Thread 类
> 实现(implements) Runnable 接口
> 继承与实现的区别和联系
> public class Thread implements Runnable
> 实现避免了java中单继承的局限性,所以最好用实现的方式实现多线程(比如在多个线程操纵同一个
资源的情况,使用实现接口方式只需要 new 一个对象就可以了)
> 使用多线程的优点:
1、提高程序执行速度,对图形化界面更有意义,可增强用户体验
2、提高计算机系统CPU的利用率
3、改善程序结构,将既长又复杂的进程分为多个线程,独立运行,利于理解和修改
一、线程的分类:
> 用户线程
> 守护线程:用它来服务用户线程的,通过在start()方法前调用thread.setDaemon(true)可以把一个用
户线程编程守护线程, Java垃圾回收机制就是典型的守护进程
> 若 JVM 中都是守护进程,则当前 JVM 将退出
二、线程的生命周期
1、新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态
2、就绪:处于新建状态的线程被 start() 之后,将进行线程队列等待 CPU 时间片,此时已具备运行条件
3、运行:当就绪的线程被调度并获得处理器资源时,进入运行状态,run() 方法定义了线程的操作和功能
4、阻塞:被人为挂起或执行输入输出操作时,让出CPU 并临时中止自己的执行,进入阻塞状态
5、死亡:线程完成了他的全部工作或线程被提前强制性的中止
> 图示
三、线程的同步机制
1、方式一:同步代码块
> Synchronized的使用方法:
synchronized(同步监视器){
// 操作共享资源的代码(被同步的代码块)
}
> 同步监视器:由一个类的对象来充当,哪个线程获取此监视器,哪个线程就可以执行大括号里的代码
2、方式二:同步方法
> 将操作共享数据的方法声明为 synchronized,即此方法为同步方法,能够保证当其中一个线程执行
此方法时,其他线程在外等待直至此线程执行完此方法
四、线程通信
> wait():令当前线程挂起并放弃CPU、同步资源,使别的线程可访问并修改共享资源,而当前线程排队
等候再次对资源的访问
> notify() :唤醒正在排队等待同步资源的线程中优先级最高者结束等待
> notifyAll():唤醒正在排队等待资源的所有线程结束等待
> java.lang.Object 提供的这三个方法只能在 synchronized 方法或 synchronized 代码块中才能使用,否
则会报 java.lang.illegaMonitorStateException 异常