zoukankan      html  css  js  c++  java
  • Java多线程相关方法(Object类和Thread类)

    1.Object类

    wait(空参的)线程进入waiting状态(有参的)线程进入timed_waiting状态

    notify

    notifyAll

     

    (1)notify

      public final native void notify();

    调用一个Object对象的notify()方法,就会唤醒一个正在等待该线程的锁的线程

    (当前可能会有好几个线程调用了该Object对象的重载的wait方法,等待唤醒,该方法只能唤醒一个,随机的)

    唤醒的线程不会立即执行,它会与其他线程一起,争夺资源

    notify方法只能被持有该Object对象锁的线程调用

    如何获得对象的锁?

    (1)执行该对象的同步实例方法

    (2)执行该类的同步静态方法

    (3)执行该对象的同步代码块

    同一时刻,只有一个线程拥有一个对象的锁

    如果当前线程没有持有该对象的锁,抛出异常:IllegalMonitorStateException 

    (2)notifyAll

      public final native void notifyAll();

    调用一个Object对象的notifyAll方法,会唤醒所有等待当前对象的锁的线程

    调用该方法的线程必须持有当前对象的锁

    唤醒所有等待该对象的锁之后,一起争夺锁

    (3)空参wait() 相当于 wait(0)

    调用一个Object对象的空参的wait()方法,会导致当前线程进入等待(waiting)状态,直到另一个线程调用该Object对象的notify()或者notifyAll()方法

    调用wait方法时,当前线程必须持有该Object对象的锁

    调用该方法之后,调用该方法的线程进入该Object对象的等待池,并放弃该对象上的所有锁

    InterruptedException

    IllegalMonitorStateException

     

    public final void wait() throws InterruptedException {
      wait(0);
    }

    public final native void wait(long timeout) throws InterruptedException;

    public final void wait(long timeout, int nanos) throws InterruptedException{……}

     

    (4)一个参数的wait(?)

      调用一个Object对象的wait(?)方法,会导致当前线程进入超时等待(timed_waiting)状态

      *调用notify

      *调用notifyAll()

      *调用interrupt

      *等待时间到

    2.Thread类

      run

      start

      sleep(没有空参的,只有有参的)线程进入timed_waiting状态

      interrupt

      yeild

      join(空参的)线程进入waiting状态(有参的)线程进入timed_waiting状态

    (1)start

    使当前线程开始执行

    调用start方法之后,JVM会调用当前线程的run方法

    (2)run

    如果当前线程实现了Runnable接口,则接口实现类的run方法被调用

    如果直接调用run方法,不能启动一个线程,相当于调用了一个普通方法

    (3)sleep

    没有空参的方法

    使线程进入TIMED_WAITING状态

    public static native void sleep(long millis) throws InterruptedException;

    public static void sleep(long millis, int nanos)throws InterruptedException {……}

    使当前正在执行的线程休眠(暂停执行)指定的毫秒数

    受到系统定时器和调度器精度和准确度的影响

    当前线程休眠指定的毫秒数,在休眠期间不会释放它已经持有的任何锁

    InterruptedException(当前正在休眠的线程被其它线程打断)

    IllegalArgumentException(参数无效)

    (4)join

    public final void join() throws InterruptedException {
      join(0);
    }

    public final synchronized void join(long millis) throws InterruptedException

    public final synchronized void join(long millis, int nanos) throws InterruptedException

    在当前线程内调用其它线程的join方法,当前线程进入Waiting或者TIMED_WAITING状态

    释放已经持有的对象锁

    等待时间到或者其它线程执行完毕,当前线程进入就绪状态

     

    (5)yield

    让步,从而让其他具有相同优先级的线程获取执行权,但是,并不能保证当前线程调用yield之后,其它具有相同优先级的线程就一定能获得执行权

    提示调度器当前线程愿意让出当前正在使用的处理器

    调度器可以忽略该提示

    线程从执行状态变成就绪状态

    public static native void yield();

    不会释放锁

     

    (6)interrupt

    将线程的中断状态设为true

    并不会立刻终止线程

    判断是否中断:

     

    判断当前线程是否中断,并清除中断标志

    public static boolean interrupted() {
    return currentThread().isInterrupted(true);
    }

    判断方法调用线程是否中断,不清楚中断标志

    public boolean isInterrupted() {
    return isInterrupted(false);
    }

     

    Object wait  VS Thread sleep

    (1)sleep没有空参的重载形式

    (2)wait释放锁   sleep持有锁

    (3)空参的sleep,使线程进入waiting状态

    (4)有参的wait和sleep,都会使线程进入TIMED_WAITING状态

    (5)都有InterruptedException

     

    Object wait  VS Thread yield

    (1)wait释放锁

    (2)yield不释放锁

    (3)wait释放锁,使当前线程进入等待状态

    (4)yield不释放锁,使当前线程进入就绪状态

    (5)wait会使所有等待该对象锁的线程都争夺资源

    (6)yield只会使同一优先级的就绪的线程争夺资源

     

    Tread.currentThread(0.getName();

    isLive() 

     

  • 相关阅读:
    最小费用流(km的另一种使用思路)
    最小费用流(km的另一种使用思路)
    Python 字符串格式化
    Python字符串运算符
    Python 字符串连接
    Python 访问字符串中的值
    虚拟纹理与几何图像技术
    深度学习与传统图像识别
    ASML光刻机PK 原子弹,难度?
    L4自动驾驶技术
  • 原文地址:https://www.cnblogs.com/duanjiapingjy/p/9426957.html
Copyright © 2011-2022 走看看