2023-12-04
线程常用方法
- yield 线程的礼让。让出CPU,让其他线程执行,但让的时间不确定,所以不一定礼让成功
- join 线程的插队。线程的一旦插入成功,则肯定先执行完插入的线程的所有任务
用户线程和守护线程
-
用户线程:也叫工作线程,当线程任务执行完或者收到通知来结束
-
守护线程:一般是为工作线程服务的,当所有用户线程结束,守护线程自动结束
(常见:垃圾回收机制)
-
将子线程设置为主线程结束时结束:子线程名.setDaemon(true);
线程的生命周期
线程可以处于的六种状态
- NEW:尚未启动的线程处于此状态
- RUNNABLE:在java虚拟机中执行的线程处于此状态
- BLOCKED:被阻塞等待监视器锁定的线程处于此状态
- WAITING:正在等待另一个线程执行特定动作的线程处于此状态
- TIMED_WAITING:正在等待另一个线程执行动作达到指定等待时间的线程处于此状态
- TERMINATED:已退出的线程处于此状态
线程状态转换图
注意事项
- RUNNABLE状态可以细化为READY(准备就绪)和RUNNING(运行中)状态
- 获取线程当前状态:线程名.getState()
Synchronized
线程同步机制
- 在多线程中,一些敏感的数据不允许被多个线程同时访问,此时使用同步访问技术。保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性
- 线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作
同步具体方法
互斥锁
- 在java语言中,引入了对象互斥锁的概念,来保证共享数据时操作完整性
- 每个对象都对应一个可以称为”互斥锁“的标记,这个标记用来保证在任意时刻,只能有一个线程访问该对象
- 关键字Synchronized用来与对象的互斥锁联系,当某个对象用Synchronized来修饰时,表明该对象在任意时刻,只能有一个线程访问。
- 同步的局限性:导致程序的执行效率降低
- 同步方法(非静态的)的锁可以是this的,也可以是其他对象的(默认为this)
- 同步方法(静态的)的锁为当前类本身(默认为当前类.class)
实现步骤
- 分析上锁的代码
- 选择同步代码块或同步方法
- 要求多个线程的锁的对象为同一个