线程:
进程:正在运行的应用程序
线程:进程中的一条执行路径
单线程: 应用程序只有一条执行路径
多线程: 应用程序有多条执行路径
|---创建线程的两种方式:
方式1: 继承Thread
a: 自定义类 继承 Thread
b: 重新Thread类中的run()方法
c: 创建自定义类对象(线程对象)
d: 启动线程? start()方法
方式2: 实现Runnable
a: 自定义类 实现 Runnable
b: 实现接口中的run()方法
c: 创建自定义类对象
d: 创建Thread对象,然后把自定义类对象 作为构造方法的参数使用
e: 开启线程, start()方法
|---多线程的几种状态:临时阻塞状态(具备CPU执行资格,不具备执行权),运行状态(线程具备执行资格和执行权),冻结状态(线程不具备CPU执
行资格,线程释放CPU执行权)
|---多线程里面的重点内容:(面试有人被问过)
同步机制:
解决多线程安全问题
同步代码块
格式:
synchronized (锁对象) {
需要同步的代码
}
同步方法
(普通同步方法)
(静态同步方法)
格式:
修饰符 synchronized 返回值类型 方法名(参数列表){....}
注意:
同步代码块,如果有多个同步代码块,那么锁对象,要求一致
同步方法,同步方法的锁对象是谁? this
同步方法,同步静态方法的锁对象是谁? 字节码文件对象, 类名.class
Collections
public static 集合 synchronizedXxx(Xxx 集合): 把不同步的集合, 变成 线程同步的集合
死锁:最常见的原因是锁的嵌套循环,例如if else判断语句里面,当线程满足if条件,获得A锁执行if里面的同步,A同步里面还嵌套
了一个同步,需要B锁,这时线程切换到else条件,获得了B锁执行里面的同步,这个同步里面也嵌套了一个同步,需要获得A锁才能执行。
sleep是线程冷却,比喻说释放魔法技能有技能CD。
|
|