JAVA多线程基础(二)

  1. JAVA线程类的常用基本方法

  1. Thread(Runnable target, String name):线程的名称
  2. currentThread():获取当前线程的对象
  3. sleep(long millis):线程休眠多次的时间
  4. yield() :暂停现在执行的程序
  5. start():启动一个线程,虚拟机会调用run方法
  6. getId():获取线程的标识符
  7. getName() :获取线程的名称
  8. getPriority() :获取线程的优先级 > 线程的优先级默认是5
  9. isAlive():线程是否处于活动状态。
  10. join() :等待该线程终止。
  11. setName(String name) :设置线程的名称
  12. setPriority(int newPriority):更改线程的优先级。参数范围[1,10]

  1. JAVA线程状态也就是线程的生命周期

线程的五种状态:

  • 新建状态(New):线程实例化之后new出来之后,它就处于现在的这个状态。
  • 就绪状态(Runnable):线程已经实例化了,并且调用start()方法,虚拟机启动该线程,该线程会以一个就绪状态随时可能会被调度执行。
  • 运行状态(Running):如果想要运行的话,线程需要得到处理资源(比如CPU的运算资源),只要线程得到处理资源就可以从就绪状态进入到运行状态。

进入运行状态有三种选择:

  1. 调用yield()>暂停的方法,停止运行或者程序失去了处理资源就会回到就绪状态
  2. 调用sleep()休眠的方法/IO阻塞或者等待同步锁或者等待通知就会进入阻塞状态
  3. 从阻塞状态等到了sleep()结束/IO已经有了返回或者等待拿到同步锁又或者拿到了通知,就会阻塞状态从新进入一个就绪状态,再一次等待系统分配资源。

  • 阻塞状态(Blocked):线程因为某个原因暂停执行,并让CPU的使用权后便进入了阻塞状态。
  1. 等待阻塞:程序运行了wait()方法之后,线程就会被放入等待池。
  2. 同步阻塞:运行线程获取对象的同步锁时,该锁已经被其他线程获得,虚拟机会把该线程放入锁定池。
  3. 其他线程:调用运行线程的sleep()方法或者join()方法或者IO请求的时候,进入阻塞状态。
  • 结束状态(Dead):当一个程序执行调用的是stop()/Eroor或者抛Exception在或者执行完毕之后的情况下,它就代表完成了线程工作就进入了死亡状态也就是程序已经结束了。

  1.  线程同步(线程的安全)

通过模拟取钱过程演示线程安全问题。 一般取钱过程:-》(施显君授课)2021-3-29

  1. 用户输入账户、密码,系统判断用户的账户、密码是否匹配。
  2. 用户输入取款金额。
  3. 系统判断账户余额是否大于取款金额。

4. 如果余额大于取款金额,则取款成功;如果余额小于取款金额,则取款失败。

在模拟过程中就模拟后面三步,没有模拟账户密码验证过程。

  1. 使用同步代码块
  • 为了解决线程的安全问题,JAVA的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块。

 

obj叫作同步监视器一般叫做锁对象,在任何线程进入代码块之前必须先获得锁对象(obj);锁对象是可以任意对象,但必须保证是同一对象。

任何时刻只能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成后该线程会释放对该同步监视器的锁定。

  1. 同步方法:直接加载在方法上面;非sattic方法,无需显示指定同步的监视器,同步方法的同步监视器就是 > this,也就是调用方法的对象。

  1. 同步锁(Lock)
  • Java5开始,提供了一种更强大的线程同步机制,更广泛的锁定操作,比较常用的是ReentranLock(可重入锁)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值