java中的锁池和等待池是什么_线程的几个状态及方法,等待池和锁池的理解

线程状态:

创建状态:创建一个线程实例 Thread thread = new Thread();

就绪状态:在调用start()方法后,线程获取了除CPU的其他资源,处于就绪状态

执行状态:线程获取CPU使用权,run方法开始执行

阻塞状态:运行中的线程由于其他原因放弃对CPU使用(其他线程抢占)而处于阻塞状态:

1等待阻塞:调用wait()方法,该线程释放所有资源,包括CPU()资源和锁资源,并且释放锁标志,jvm会把该线程放入等待池,不会自动唤醒,要等待其他线程的notify()或notifyAll()唤醒该线程才会重新获得锁标志并且出入就绪态

2同步阻塞:由于线程获取同步锁synchronized失败而处于阻塞状态

3其他阻塞:sleep()方法或join()方法,该类型阻塞会自动唤醒,sleep()超时,join()等待子线程完成后线程会自动唤醒而处于就绪状态,该状态不会释放锁资源,但会释放CPU()资源,会暂时放弃对CPU的占有。

死亡状态:线程执行完run方法或退出run方法就进入了死亡状态

线程的几个方法:

1 start():调用start()处于就绪状态

2 run():执行后处于运行状态

执行完run()和start()后线程死亡

3 sleep(),join()和wait()区别:

sleep,join会释放Cpu资源,但不会释放锁资源,而且会自动唤醒。但是sleep()和join又有不同:

sleep()是自身线程调用,且阻塞超过一定时间后进入就绪态,然后获取Cpu继续执行,而join是其他线程的调用,自身线程阻塞,等待其他线程执行完后进入就绪态,然后获取Cpu让自身线程继续执行。

区别:join内部调用了wait(),是会释放锁的,其他线程可以调用该线程的同步方法,sleep()不具备放锁特点,该线程执行完才会放锁,是static的静态方法;

join()方法遇到interrupt()方法会出现interrupt异常,B.join(),A等待B线程执行,这是遇到了interrupt(),B会暂停但是A会继续执行。

wait()会释放Cpu资源和锁资源,不会自动唤醒。必须要其他线程调用notify()或notifyAll()才会唤醒到达就绪态,获取Cpu后才会继续执行

4:wait(),notify(),notifyAll():

用到的情景:Synchronized语句里使用,用于线程的同步;

wait()方法调用后,线程处于阻塞状态并释放所有资源,将线程处于等待池中,其他线程调用notify()会从等待池唤醒任意一个线程并且放入锁池,调用notifyAll()唤醒所有等待池中的线程并放入锁池,锁池里的线程可以任意争取锁的权力。获得锁的线程将出入就绪状态;

如果使用wait(long time)的方法,达到时间后会自动进入锁池,不需要notify()方法唤醒

5:yield()方法:与sleep()类似,不会释放锁,执行后让线程直接回到就绪状态;可能执行完yield()方法的线程马上又被执行;同优先级和优先级高的线程得到执行机会

三 等待池和锁池的理解:当调用了wait()方法,释放锁资源和Cpu资源,线程进入等待池,当其他线程调用notify()会从等待池任意选择一个线程调入锁池,notifyAll()会调用所有等待池线程进入锁池,锁池里的对象可以竞争锁,优先级高的获得锁的能力更强,获得锁的线程可以进入就绪态继续执行,执行完之后释放锁,然后锁池里的线程再继续竞争。

标签:调用,join,池和锁池,线程,sleep,就绪,等待,wait

来源: https://blog.csdn.net/zhaojunwei666/article/details/96433488

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值