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

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

  • 相关阅读:
    ok6410驱动usb摄像头
    自己动手写CPU之第五阶段(1)——流水线数据相关问题
    ListView嵌套ListView时发生:View too large to fit into drawing cache的问题
    算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)
    Android_通过ContentObserver监听短信数据变化
    【MyEcplise】导入项目报错:Errors running builder 'JavaScript Validator' on project '项目名'. java.lang.ClassCastException
    【js】js中const,var,let区别
    【Node.js】2.开发Node.js选择哪个IDE 开发工具呢
    【Node.js】1.安装步骤
    【POI】对于POI无法处理超大xls等文件,官方解决方法【已解决】【多线程提升速率待定】
  • 原文地址:https://www.cnblogs.com/xxj-bigshow/p/9542519.html
Copyright © 2011-2022 走看看