当前位置:首页 » 编程语言 » javasleep

javasleep

发布时间: 2022-07-20 13:05:14

java 中 sleep 和 wait 的区别

首先:sleep是通过线程来调用的。它是Thread身上的方法。而wait是Object身上的方法。
所以调用的时候需要用object来调用。
其次:原理不同。当前线程在同步代码块中,调用sleep之后,当前线程并没有释放锁。意味着
其他线程如果竞争这个锁。就要等待。
而当前线程在同步代码块中调用obj.wait之后。当前线程已经释放锁了。意味着其他对象,如果竞争
这个锁。不需要等待。
说这么多,不如上代码。场景:两个线程同时竞争一个资源。使用同步代码块。
①竞争同一个obj对象,使用sleep。
publicclassTestSleep{
publicstaticvoidmain(String[]args)throwsException{
finalObjectobj=newObject();
finalThreadt1=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("1");
}
}
};
finalThreadt2=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
System.out.println("2");
}
}
};
t1.start();
Thread.sleep(100);//确保t1先执行。先抢到obj的控制权。
t2.start();
}
}
分析:创建一个obj。两条线程。Thread.sleep(100);确保让t1先执行到run方法。所以t1会
先抢到obj的资源,给它上锁。需要睡000ms,并不释放obj锁。此时t2已经跑起来,走到run方法同步代码块。
发现obj已经被t1抢到了。所以t2只能等t1释放obj锁。而t1什么时候释放obj锁?t1的同步代码
块执行完释放。什么时候执行完?打印1的时候执行完。t1释放锁之后。t2得到锁。因为这里只有两条
线程竞争obj锁。所以接下来就打印2。
最终结果是先打印1再打印2。

再看另个一例子:
②竞争同一个obj对象,使用wait。
publicclassTestWaint{
publicstaticvoidmain(String[]args)throwsException{
finalObjectobj=newObject();
finalThreadt1=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
try{
obj.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("1");
}
}
};
finalThreadt2=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
System.out.println("2");
obj.notify();
}
}
};
t1.start();
Thread.sleep(100);//确保t1先执行。
t2.start();
}
}

分析:创建一个obj。两条线程。Thread.sleep(100);确保让t1先执行到run方法。所以t1会
先抢到obj的资源,给它上锁。然而接下来t1中调用了obj.wait();这个代码,表示t1放弃对obj
的拥有权。也就是释放锁。(释放了之后它需要等待。而不是往下执行,等待什么?等待别人唤醒。
因为wait和notify方法相对。必须要有一个线程调用obj.nofity();时,t1才有可能再次苏醒。否则永远等待。)
t1释放锁,进入等待。意味着t2不用等到t1的同步代码块结束,就可以获取到obj的控制权。
所以t2就给obj上锁了。所以t2先打印2。然后调用了obj.nofity();此时t2已经结束。
由于没有其他线程和t1竞争。此时t1苏醒,再次获获得obj的控制权。往下走,t1线程结束。
所以:先打印2再打印1
讲了挺多。我也觉得啰嗦。但是应该通俗易懂吧。

Ⅱ java中线程里的sleep的用法与yield的用法~

我来简单答一下吧,yield建议不要使用了,这里不做解释。wait字面理解就是等待,多用于并发处理中对资源的管理,调用该方法后,当前线程会放弃已取得的资源(就是放弃已获得资源的锁)并放弃cpu占用,只到被notify,另被notify后,被wait的线程会从wait()方法后面继续执行。sleep方法是当前线程放弃cpu的执行机会知道sleep时间结束。

Ⅲ java sleep方法

调用方法:Thread.sleep(0);
括号内输入要睡眠的毫秒数(1秒等于1000毫秒),调用这个方法会抛出异常,需要抛出或处理,它在睡眠被打断时发生。

Ⅳ java中的sleep是什么意思

sleep(毫秒数)是Thread类的静态方法。
使用时:Thread.sleep(毫秒数);
如Thread.sleep(1000);该线程睡眠1秒钟,之间此线程什么都不做。
等1秒钟之后,继续余下代码执行。
不过线程是没有保证的。也许1秒钟之后,该线程没有转为可运行状态,也是可能的。

Ⅳ java 中sleep()方法或者wait()方法的使用

简单说:sleep由线程自动唤醒,wait必须显示用代码唤醒。

sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行,例如:

try{
System.out.println("I'm going to bed");
Thread.sleep(1000);
System.out.println("I wake up");
}
catch(IntrruptedException e) {
}

wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者,例如:

//Thread 1

try{
obj.wait();//suspend thread until obj.notify() is called
}
catch(InterrputedException e) {
}

Ⅵ java中thread.sleep是什么意思

sleep()方法是Thread类里面的,主要的意义就是让当前线程停止执行,让出cpu给其他的线程,但是不会释放对象锁资源以及监控的状态,当指定的时间到了之后又会自动恢复运行状态。
wait()方法是Object类里面的,主要的意义就是让线程放弃当前的对象的锁,进入等待此对象的等待锁定池,只有针对此对象调动notify方法后本线程才能够进入对象锁定池准备获取对象锁进入运行状态。

Ⅶ java中的sleep()方法!

不管哪个sleep启动,结果都是:100 ,1000
;因为方法m2没在线程run()方法调用,不受sleep影响,所以当sleep时,给m2时间先运行,然后再是run()中的m1。

Ⅷ java中的sleep()方法

1.所有这些语句都必须在方法里面写,类里面只能存在属性和方法。不存在语句
2.thread.sleep()需要捕捉异常,加try/catch

热点内容
荣耀畅玩什么配置 发布:2025-02-01 00:36:35 浏览:458
电脑对时服务器 发布:2025-02-01 00:36:22 浏览:162
闪迪存储卡港版 发布:2025-02-01 00:31:25 浏览:78
visualstudio编译器 发布:2025-02-01 00:31:20 浏览:753
如何移植安卓上面的软件 发布:2025-02-01 00:28:03 浏览:121
一刀传世混沌和破天是什么服务器 发布:2025-02-01 00:28:00 浏览:688
红米k40怎么修改安卓data 发布:2025-02-01 00:23:04 浏览:886
文件夹怎么显示全名 发布:2025-02-01 00:10:30 浏览:860
sdwebimage缓存机制 发布:2025-02-01 00:02:55 浏览:886
安卓手机如何调电视 发布:2025-01-31 23:54:37 浏览:556