- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java 中sleep() 和 wait() 的对比由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
java 中sleep() 和 wait() 的对比 。
结合synchronized,会更好的理解sleep()和wait()这两个方法,当然也就知道了他们的区别了。这篇博客就一起学习这两个方法 。
sleep() 。
sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间.
因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象.
下面用一个例子来演示:
Service类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
class
Service {
public
void
mSleep(){
synchronized
(
this
){
try
{
System.out.println(
" Sleep 。当前时间:"
+System.currentTimeMillis());
Thread.sleep(
3
*
1000
);
}
catch
(Exception e){
System.out.println(e);
}
}
}
public
void
mWait(){
synchronized
(
this
){
System.out.println(
" Wait 。结束时间:"
+System.currentTimeMillis());
}
}
}
|
就定义了两个方法, mSleep()方法会让调用线程休眠3秒,mWait() 就打印一句话。两个方法都使用了同步锁.
SleepThread类:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
SleepThread
implements
Runnable{
private
Service service;
public
SleepThread(Service service){
this
.service = service;
}
public
void
run(){
service.mSleep();
}
}
|
线程类,用于调用Service 的mSleep方法 。
WaitThread类:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
WaitThread
implements
Runnable{
private
Service service;
public
WaitThread(Service service){
this
.service = service;
}
public
void
run(){
service.mWait();
}
}
|
线程类,用于调用Service 的mWait方法 。
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
Test{
public
static
void
main(String[] args){
Service mService =
new
Service();
Thread sleepThread =
new
Thread(
new
SleepThread(mService));
Thread waitThread =
new
Thread(
new
WaitThread(mService));
sleepThread.start();
waitThread.start();
}
}
|
创建了一个Service对象并赋值给mService,还创建了两个线程并传入mService,也就是说两个线程启动后,调用的是同一个Service对象的方法.
先看下结果:
梳理一下逻辑:
首先sleepThread线程会启动起来,然后在run方法里调用Service对象的mSleep方法,到了同步代码块后,this就是Test类里创建的Service对象mService,sleepThread线程获得了Service对象的锁,之后进入了休眠状态,但并没有释放该Service对象的锁.
这时waitThread线程也启动了起来,调用Service对象的mWait方法,同样到了同步代码块,因为Service对象的锁已经被sleepThread占了,所以waitThread线程只能干等着.
等到sleepThread线程执行完毕(休眠结束)后释放了同步锁,waitThread线程拿到了同步锁,会继续执行,mWait才会被调用.
如果sleepThread释放了机锁的话,waitThread 的任务会马上得到执行。从打印结果可以看出,waitThread 的任务是3秒钟之后才得到执行.
同步锁,锁住的是一个对象。如果一个线程拿到了一个对象的机锁去执行一段同步代码块了,那么其他线程都不能执行这个对象的其他同步代码块.
在这个例子中就是sleepThread线程拿到了service对象的同步锁,进入后休眠,但没有释放机锁,那么waitThread线程是不能执行这个service对象的其他同步代码块的,也就就是不能进入这一段代码 。
1
2
3
4
|
synchronized
(
this
){
System.out.println(
" Wait 。结束时间:"
+System.currentTimeMillis());
}
|
相信现在你已经理解了sleep方法没有释放机锁会带来什么结果了,那么继续wait 。
wait() 。
wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程 。
下面修改程序如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public
class
Service {
public
void
mSleep(){
synchronized
(
this
){
try
{
Thread.sleep(
3
*
1000
);
this
.notifyAll();
System.out.println(
" 唤醒等待 。 结束时间:"
+System.currentTimeMillis());
}
catch
(Exception e){
System.out.println(e);
}
}
}
public
void
mWait(){
synchronized
(
this
){
try
{
System.out.println(
" 等待开始 。 当前时间:"
+System.currentTimeMillis());
this
.wait();
}
catch
(Exception e){
System.out.println(e);
}
}
}
}
|
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
Test{
public
static
void
main(String[] args){
Service mService =
new
Service();
Thread sleepThread =
new
Thread(
new
SleepThread(mService));
Thread waitThread =
new
Thread(
new
WaitThread(mService));
waitThread.start();
sleepThread.start();
}
}
|
同样先看下打印结果 。
这里是先让 waitThread线程启动起来,然后waitThread线程进入等待状态,并释放了Service对象的锁,这时sleepThread也启动了,来到了mSleep方法的同步代码块,因为之前的waitThread线程已经释放了Service对象的机锁,sleepThread可以拿到对象锁,所以mSleep方法是会被马上调用的。然后sleepThread线程就是进入了睡眠状态,等到3秒休眠结束后调用notifyAll()唤醒了waitThread线程.
综上所诉:
sleep() 和 wait() 的区别就是 调用sleep方法的线程不会释放对象锁,而调用wait() 方法会释放对象锁 。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
原文链接:http://blog.csdn.net/xyh269/article/details/52613507 。
最后此篇关于java 中sleep() 和 wait() 的对比的文章就讲到这里了,如果你想了解更多关于java 中sleep() 和 wait() 的对比的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在一次采访中遇到过这个问题。 线程中wait和wait on time有什么区别? 我知道 wait 方法 导致当前线程等待,直到另一个线程调用此对象的 notify() 方法或 notifyAll
我在这里得到了一个 java 代码片段,这让我想知道调用 wait() 和 this.wait() 之间的区别是什么。 假设您有一个类,该类具有获取资源的方法并且是同步的。通常,如果资源不可用,我会在
我知道如何使用 wait_event 在 Linux 内核队列中等待以及如何唤醒它们。 现在我需要弄清楚如何同时在多个队列中等待。我需要多路复用多个事件源,基本上以类似于 poll 或 select
c系统编程中wait(null)和wait(&status)有什么区别? 指针状态的内容是什么? 最佳答案 如果您调用 wait(NULL) ( wait(2) ),您只会等待任何子进程终止。使用 w
设想: 用户单击 View 上的按钮 这会调用 ViewModel 上的命令 DoProcessing 考虑到 View 和 ViewModel 的职责,Wait 光标是如何以及在哪里设置的? 为了清
我在使用 Selenium 的代码中看到了 FluentWait 和 WebDriverWait。 FluentWait 使用轮询技术,即它将在每个固定时间间隔轮询特定的 WebElement。我想知
我编写了以下代码,其中 start 方法应该等待,直到 stop 方法通知它。但是在执行过程中,尽管我已指定它等待,但启动方法下面的日志行会被打印。下图是我的start方法实现如下。 private
我有以下连接到 SignalR Hub 的代码 private static async Task StartListening() { try {
我对线程中的 wait() 方法如何工作感到很困惑。假设我写: public class test3 { public static void main(String args[]){
在使用 Java 线程原语构造线程安全有界队列时 - 这两种构造之间有什么区别 创建显式锁定对象。 使用列表作为锁并等待它。 示例 1 private final Object lock = new
故事: 在 Java selenium 语言绑定(bind)中有一个 FluentWait class ,这允许严格控制如何检查预期条件: Each FluentWait instance defin
wait-die 和 wound-wait 算法有什么区别? 这两种死锁预防技术似乎都在做同样的事情:回滚旧进程。 两者有什么区别? 请提供一个合适的例子来对比这两种算法。 最佳答案 Wait-Die
在 Java 线程转储中,您可以看到堆栈跟踪中提到的锁。 似乎有三种信息: 1: - locked (a java.io.BufferedInputStream) 2: - waiting to l
以下代码运行大约需要 20 秒。然而,取消注释 do! 后只用了不到一秒的时间。为什么会有这么大的差异? 更新:使用ag.Add时需要9秒。我已经更新了代码。 open FSharpx.Control
我在 ASP.NET WebForms 网站上有一个服务器端点击事件。在这种情况下,我调用一个方法,该方法又调用其异步合作伙伴方法,在调用中添加 .Wait()。 此方法然后向下几个级别(即,调用另一
有 3 种状态的线程处于 Activity 状态但既不运行也不可运行:- sleep 已阻止 正在等待 当线程执行 sleep() 方法时,它会在其参数指定的时间段(比如几毫秒)内从运行状态进入休眠状
考虑以下代码 public class ThreadTest1 { private static final long startTime = System.currentTimeMillis();
我有一个使用线程的 Java 应用程序,它使用多个 Lock 对象实例来同步对公共(public)资源的访问。 现在,作为性能测量的一部分,我想测量每个线程在每个锁中花费的时间。到目前为止,我已经尝试
我写了下面这段代码: let first_row = rows_stream.take(1).wait(); 并收到以下错误(当我真正想要访问该元素时): found struct `futures:
我使用了两个命令来等待设备启动:adb 等待设备和 adb 等待设备。两者似乎都在等待设备启动,我发现它们的行为没有任何区别。他们的行为有什么不同吗? 添加更多关于我所做的信息: 所以这就是我所做的,
我是一名优秀的程序员,十分优秀!