欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java中的sleep()和wait()的区别

程序员文章站 2023-12-26 13:41:09
原地址:https://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html ......
对于sleep()方法,我们首先要知道该方法是属于thread类中的。而wait()方法,则是属于object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
wait只有在synchronized中才有意义
什么意思呢?

举个列子说明:

复制代码
 1 /**
 2  * 
 3  */
 4 package com.b510.test;
 5 
 6 /**
 7  * java中的sleep()和wait()的区别
 8  * @author hongten
 9  * @date 2013-12-10
10  */
11 public class testd {
12 
13     public static void main(string[] args) {
14         new thread(new thread1()).start();
15         try {
16             thread.sleep(5000);
17         } catch (exception e) {
18             e.printstacktrace();
19         }
20         new thread(new thread2()).start();
21     }
22     
23     private static class thread1 implements runnable{
24         @override
25         public void run(){
26             synchronized (testd.class) {
27             system.out.println("enter thread1...");    
28             system.out.println("thread1 is waiting...");
29             try {
30                 //调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
31                 testd.class.wait();
32             } catch (exception e) {
33                 e.printstacktrace();
34             }
35             system.out.println("thread1 is going on ....");
36             system.out.println("thread1 is over!!!");
37             }
38         }
39     }
40     
41     private static class thread2 implements runnable{
42         @override
43         public void run(){
44             synchronized (testd.class) {
45                 system.out.println("enter thread2....");
46                 system.out.println("thread2 is sleep....");
47                 //只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
48                 testd.class.notify();
49                 //==================
50                 //区别
51                 //如果我们把代码:testd.class.notify();给注释掉,即testd.class调用了wait()方法,但是没有调用notify()
52                 //方法,则线程永远处于挂起状态。
53                 try {
54                     //sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,
55                     //但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
56                     //在调用sleep()方法的过程中,线程不会释放对象锁。
57                     thread.sleep(5000);
58                 } catch (exception e) {
59                     e.printstacktrace();
60                 }
61                 system.out.println("thread2 is going on....");
62                 system.out.println("thread2 is over!!!");
63             }
64         }
65     }
66 }
复制代码
运行效果:

复制代码
enter thread1...
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over!!!
thread1 is going on ....
thread1 is over!!!
复制代码
如果注释掉代码:

1 testd.class.notify();
运行效果:

复制代码
enter thread1...
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over!!!
复制代码
且程序一直处于挂起状态。

原地址:https://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html

上一篇:

下一篇: