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


    引自:https://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 }
    复制代码

    运行效果:

    复制代码
    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!!!
    复制代码

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

  • 相关阅读:
    hdu 5645 DZY Loves Balls
    idea2016的使用心得 --- 太棒了
    20170410 --- Linux备课资料 --- 压缩与解压缩
    20170410 --- Linux备课资料 --- vim的使用
    mysql20170410练习代码+笔记
    你说你有多坑?----超市项目错误总结
    说好的不熬夜呢???!!!! -- 超市项目
    那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
    今天思考一个问题 --- 自己的强项是什么??
    sleep()和wait()的区别 --- 快入睡了,突然想起一个知识点,搞完就睡
  • 原文地址:https://www.cnblogs.com/xxj-bigshow/p/9542519.html
Copyright © 2020-2023  润新知