zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    opensuse tumbleweed中安装code
    树莓派中将caplock映射为esc键
    记录一次奇怪但是很有意义的程序编译警告
    新树莓派系统安装ROS记录
    程序的深挖
    intle官方手册下载
    slax linux的定制
    angular4 *ngFor获取index
    axios post传参后台无法接收问题
    AMD、CMD、CommonJs和 ES6对比
  • 原文地址:https://www.cnblogs.com/liangwenbo/p/5355710.html
Copyright © 2011-2022 走看看