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


    http://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html

    对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

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

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

    而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

    获取对象锁进入运行状态。

    什么意思呢?

    举个列子说明:

     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 }

    运行效果:

    1 enter thread1...
    2 thread1 is waiting...
    3 enter thread2....
    4 thread2 is sleep....
    5 thread2 is going on....
    6 thread2 is over!!!
    7 thread1 is going on ....
    8 thread1 is over!!!

    如果注释掉代码:

    1 TestD.class.notify();

    运行效果:

    1 enter thread1...
    2 thread1 is waiting...
    3 enter thread2....
    4 thread2 is sleep....
    5 thread2 is going on....
    6 thread2 is over!!!

    且程序一直处于挂起状态。

  • 相关阅读:
    第四次作业
    第三次作业
    Java.14
    Java.13
    JAVA.12
    JAVA.11
    JAVA.10
    JAVA.9
    JAVA.8
    JAVA.7
  • 原文地址:https://www.cnblogs.com/manhuidhu/p/6546886.html
Copyright © 2020-2023  润新知