zoukankan      html  css  js  c++  java
  • 在 java 中 wait 和 sleep 方法的不同?

    最大的不同是在等待时 wait 会释放锁 sleep 一直持有锁。Wait 通常被用于线 

    程间交互,sleep 通常被用于暂停执行

    直接了解的深入一点吧

     Java 中线程的状态一共被分成 6

     183   485 初始态:NEW

    创建一个 Thread 对象但还未调用 start()启动线程时线程处于初始态

    运行态:RUNNABLE

     Java 运行态包括就绪态  运行态

    就绪态 该状态下的线程已经获得执行所需的所有资源只要 CPU 分配执行权就 

    能运行所有就绪态的线程存放在就绪队列中

    运行态 获得 CPU 执行权正在执行的线程由于一个 CPU 同一时刻只能执行一 

    条线程因此每个 CPU 每个时刻只有一条运行态的线程

    阻塞态 

    当一条正在执行的线程请求某一资源失败时就会进入阻塞态而在 Java  

    塞态专指请求锁失败时进入的状态由一个阻塞队列存放所有阻塞态的线程 

    于阻塞态的线程会不断请求资源一旦请求成功就会进入就绪队列等待执行

    PS:、IO、Socket 等都资源

    等待态 

    当前线程中调用 wait、join、park 函数时当前线程就会进入等待态也有一个 

    等待队列存放所有等待态的线程线程处于等待态表示它需要等待其他线程的指 

    示才能继续运行进入等待态的线程会释放 CPU 执行权并释放资源

    超时等待态 

    当运行中的线程调用 sleep(time)、wait、join、parkNanos、parkUntil  

    会进入该状态它和等待态一样并不是因为请求不到资源而是主动进入 

    且进入后需要其他线程唤醒进入该状态后释放 CPU 执行权  占有的资源 

    等待态的区别到了超时时间后自动进入阻塞队列开始竞争锁

     184   485 终止态 

    线程执行结束后的状态

    注意

    wait()方法会释放 CPU 执行权  占有的锁

    sleep(long)方法仅释放 CPU 使用权锁仍然占用线程被放入超时等待队列 

    yield 相比它会使线程较长时间得不到运行

    yield()方法仅释放 CPU 执行权锁仍然占用线程会被放入就绪队列会在短时 

    间内再次执行

    wait  notify 必须配套使用即必须使用同一把锁调用

    wait  notify 必须放在一个同步块中调用 wait  notify 的对象必须是他们所处 

    同步块的锁对象

  • 相关阅读:
    python下编译py成pyc和pyo
    session_id小问题大影响
    python get,post提交表单
    vmstat命令列出的属性详解
    SGU 223 Little Kings
    POJ 3233 Matrix Power Series
    HDU 2604 Queuing
    HDU 2256 Problem of Precision
    SGU 224 Little Queens
    HDU 2276 Kiki & Little Kiki 2
  • 原文地址:https://www.cnblogs.com/programb/p/12772927.html
Copyright © 2011-2022 走看看