• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
forever
博客园    首页    新随笔    联系   管理    订阅  订阅
JAVA 多线程随笔 (二) sleep, yield, join, wait 和notify

这里先说明一下锁对象,如果一个类比如Person里的方法都有synchronized来修饰,那么每一个方法的锁对象就是Person的一个实例person.

锁对象也可以针对某个特定的实例, 比如synchronized(bird) {//code;}, 此时的锁对象就是bird这个实例。

 

1. sleep

使得当前线程睡一会,醒来后继续被服务。 这样就会让其他优先级的线程(较低,同级或是高优先级)得到机会执行。

*Sleep 不会释放对象锁,也就是虽然当前线程暂停运行,但是如果它有对应的锁对象(比如当前方法是synchronized修饰的), 其他线程都无法再得到this锁对象,

所以其他synchronized方法或是synchronized(this)修饰的代码块,都不会执行。

2. yield

使得当前线程还是就绪状态,它会首先查看是否有其他同优先级的线程,如果有,则运行其他线程,如果没有,就继续原来的线程。

*yield 也不会释放对象锁

3. join

线程A调用了线程B的join方法,那么线程A会等到线程B执行完后,才继续运行后边的代码。

sleep(),yield(),join()在Thread类中定义

 

3. wait, notify 和 notifyAll

wait,notify 和 notifyAll都是用来执行同步的代码,所以它们都是在synchronized代码块中。

他们都是Object的方法,所以都是针对于一个对象,比如Student类对象student。

wait表明,当前线程放弃锁对象(student.wait(), 此时的锁对象是student实例), 并将自己放入对象等待池中。此时,其他的线程就可以得到锁对象,并且运行。

wait还可以传入参数,wait(long timeout);

notify表明,从对象等待池中,移出一个转入到锁状态等待池,如果此线程得到了锁,就执行。

notifyAll表明,从对象等待池中,移除所有线程到锁状态等待池

 

当线程A对线程B调用interrupt()方法时,如果线程B正在运行业务逻辑,它不会退出,直到线程B运行到wait(),sleep()和join()方法时,才会抛出InterruptedException.

posted on 2016-04-05 16:49  梁文博  阅读(261)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3