- JAVA线程类的常用基本方法
- Thread(Runnable target, String name):线程的名称
- currentThread():获取当前线程的对象
- sleep(long millis):线程休眠多次的时间
- yield() :暂停现在执行的程序
- start():启动一个线程,虚拟机会调用run方法
- getId():获取线程的标识符
- getName() :获取线程的名称
- getPriority() :获取线程的优先级 > 线程的优先级默认是5
- isAlive():线程是否处于活动状态。
- join() :等待该线程终止。
- setName(String name) :设置线程的名称
- setPriority(int newPriority):更改线程的优先级。参数范围[1,10]
- JAVA线程状态也就是线程的生命周期
线程的五种状态:
- 新建状态(New):线程实例化之后new出来之后,它就处于现在的这个状态。
- 就绪状态(Runnable):线程已经实例化了,并且调用start()方法,虚拟机启动该线程,该线程会以一个就绪状态随时可能会被调度执行。
- 运行状态(Running):如果想要运行的话,线程需要得到处理资源(比如CPU的运算资源),只要线程得到处理资源就可以从就绪状态进入到运行状态。
进入运行状态有三种选择:
- 调用yield()>暂停的方法,停止运行或者程序失去了处理资源就会回到就绪状态
- 调用sleep()休眠的方法/IO阻塞或者等待同步锁或者等待通知就会进入阻塞状态
- 从阻塞状态等到了sleep()结束/IO已经有了返回或者等待拿到同步锁又或者拿到了通知,就会阻塞状态从新进入一个就绪状态,再一次等待系统分配资源。
- 阻塞状态(Blocked):线程因为某个原因暂停执行,并让CPU的使用权后便进入了阻塞状态。
- 等待阻塞:程序运行了wait()方法之后,线程就会被放入等待池。
- 同步阻塞:运行线程获取对象的同步锁时,该锁已经被其他线程获得,虚拟机会把该线程放入锁定池。
- 其他线程:调用运行线程的sleep()方法或者join()方法或者IO请求的时候,进入阻塞状态。
- 结束状态(Dead):当一个程序执行调用的是stop()/Eroor或者抛Exception在或者执行完毕之后的情况下,它就代表完成了线程工作就进入了死亡状态也就是程序已经结束了。
- 线程同步(线程的安全)
通过模拟取钱过程演示线程安全问题。 一般取钱过程:-》(施显君授课)2021-3-29
- 用户输入账户、密码,系统判断用户的账户、密码是否匹配。
- 用户输入取款金额。
- 系统判断账户余额是否大于取款金额。
4. 如果余额大于取款金额,则取款成功;如果余额小于取款金额,则取款失败。
在模拟过程中就模拟后面三步,没有模拟账户密码验证过程。
- 使用同步代码块
- 为了解决线程的安全问题,JAVA的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块。
obj叫作同步监视器一般叫做锁对象,在任何线程进入代码块之前必须先获得锁对象(obj);锁对象是可以任意对象,但必须保证是同一对象。
任何时刻只能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成后该线程会释放对该同步监视器的锁定。
- 同步方法:直接加载在方法上面;非sattic方法,无需显示指定同步的监视器,同步方法的同步监视器就是 > this,也就是调用方法的对象。
- 同步锁(Lock)
- Java5开始,提供了一种更强大的线程同步机制,更广泛的锁定操作,比较常用的是ReentranLock(可重入锁)。