• 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.

  • 相关阅读:
    常见的JedisConnectionException 异常
    使用jstack分析解决进程死锁问题
    微信支付(java版本)_统一下单
    使用Quartz任务调用的时候报错Based on configured schedule, the given trigger will never fire.
    什么是localStorage、sessionStorage,与cookie的区别?
    JavaScript for循环、数组高级语法
    SpringBoot集成Swagger2
    SpringMVC全局异常处理,看这一篇就够了
    SpringMVC文件上传的三种方法
    HDU 2089 不要62 数位dp
  • 原文地址:https://www.cnblogs.com/liangwenbo/p/5355710.html
Copyright © 2020-2023  润新知