码迷,mamicode.com
首页 > 编程语言 > 详细

在 java 中 wait 和 sleep 方法的不同?

时间:2020-04-25 00:48:29      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:队列   资源   soc   同步   margin   top   正在执行   一个   yield   

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

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

直接了解的深入一点吧

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

初始态:NEW

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

运行态:RUNNABLE

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

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

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

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

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

阻塞态 

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

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

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

PS:、IO、Socket 等都资源

等待态 

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

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

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

超时等待态 

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

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

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

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

终止态 

线程执行结束后的状态

注意

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

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

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

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

间内再次执行

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

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

同步块的锁对象

在 java 中 wait 和 sleep 方法的不同?

标签:队列   资源   soc   同步   margin   top   正在执行   一个   yield   

原文地址:https://www.cnblogs.com/programb/p/12771144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!