线程中wait 和sleep 的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程中wait 和sleep 的区别相关的知识,希望对你有一定的参考价值。

线程中sleep和wait的区别:
sleep与wait最主要的区别在于,sleep与wait都可以使线程等待,但sleep不会释放资源而wait会释放资源。
代码明示:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

public class ThreadTest
public static void main(String[] args) throws InterruptedException

new Thread(new Thread1()).start();

synchronized (ThreadTest.class)
System.out.println("Main Thread go to sleep : currenttime-->"+System.currentTimeMillis());
//sleep过程不会释放资源
Thread.sleep(10000);

System.out.println("Main Thread get up : currenttime-->"+System.currentTimeMillis());
new Thread(new Thread2()).start();
System.out.println("Main Thread over");

static class Thread1 implements Runnable
@Override
public void run()
System.out.println("Thread1 is ready :currenttime-->"+System.currentTimeMillis());
//因为sleep不会释放资源,所以在主线程sleep结束前,是不能取得资源的锁,而是在等待
synchronized (ThreadTest.class)
System.out.println("Thread1 is running :currenttime-->"+System.currentTimeMillis());
System.out.println("Thread1 wait :currenttime-->"+System.currentTimeMillis());
try
ThreadTest.class.wait();
catch (InterruptedException e)
e.printStackTrace();

System.out.println("Thread1 is over ");




static class Thread2 implements Runnable
@Override
public void run()
System.out.println("Thread2 is ready :currenttime-->"+System.currentTimeMillis());
synchronized (ThreadTest.class)
System.out.println("Thread2 is running :currenttime-->"+System.currentTimeMillis());
System.out.println("Thread2 notify :currenttime-->"+System.currentTimeMillis());
ThreadTest.class.notify();
System.out.println("Thread2 is over");








输出结果:

1
2
3
4
5
6
7
8
9
10
11

Main Thread go to sleep : currenttime-->1400232812969
Thread1 is ready :currenttime-->1400232812969
Main Thread get up : currenttime-->1400232822970
Thread1 is running :currenttime-->1400232822970
Thread1 wait :currenttime-->1400232822970
Main Thread over
Thread2 is ready :currenttime-->1400232822972
Thread2 is running :currenttime-->1400232822972
Thread2 notify :currenttime-->1400232822972
Thread2 is over
Thread1 is over

由结果可以看出,当主线程sleep10s中的过程,Thread1仅仅处于ready状态,而一直没有获取到ThreadTest.class的锁,原因在于,主线程在sleep的之前已经获取了该资源的锁,这也验证了在用sleep()的时候不会释放资源。   当主线程sleep完之后,Thread1获取到了ThreadTest.class的锁,然后调用了wait方法(wait方法是Object的静态方法)。在调用该方法后,Thread2启动,且顺利获取到ThreadTest.class的锁,这也验证了在用wait()方法的时候会释放资源。
最后,在Thread2中调用notify方法(notify方法也是Object的静态方法,作用是唤醒在同步监视器上等待的一个线程),然后看到 "Thread1 is over"。wait 方法与 notify 方法或notifyAll方法 搭配使用,来协调线程运行。如果把Thread2中的notify方法去掉,会发现最后Thread1并没有再次运行,也就不会打印"Thread1 is over"。
参考技术A 线程中sleep和wait的区别:
sleep与wait最主要的区别在于,sleep与wait都可以使线程等待,但sleep不会释放资源而wait会释放资源。本回答被提问者采纳
参考技术B http://blog.csdn.net/nicklsq/article/details/7360845参考下

java中wait和sleep的区别(多线程编程)

sleep是thread中的一个方法,wait是object中的方法。

sleep是让一个线程进入休眠状态,在等待一段时间之后,进入可运行状态,等待cpu分配资源并运行。同时sleep的过程中,有可能会被线程间的消息传递,也就是有可能被其他对象调用他的interrupt(),产生InterruptedException异常如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。  

注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程 。

wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生  

其实,我们对于sleep和wait最主要的区分就是sleep只是休眠,其并没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

以上是关于线程中wait 和sleep 的区别的主要内容,如果未能解决你的问题,请参考以下文章

sleep与 wait区别

线程中sleep和wait区别

线程——sleep()和wait()方法区别

线程——sleep()和wait()方法区别

线程方法wait和sleep的区别

多线程中sleep和wait的区别,以及多线程的实现方式及原因,定时器--Timer