zoukankan      html  css  js  c++  java
  • 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!!!

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

  • 相关阅读:
    c语言基础学习10_文件操作02
    c语言_文件操作_FILE结构体小解释
    初识 Swift编程语言(中文版)
    Jquery滑动门实现
    【一步一步走(1)】远程桌面软件VNC的安装与配置
    并查集 路径压缩(具体解释)
    linux中操作java进程
    HDOJ 3944 DP?
    选择排序与冒泡排序
    UVa145 Gondwanaland Telecom
  • 原文地址:https://www.cnblogs.com/manhuidhu/p/6546886.html
Copyright © 2011-2022 走看看