Maison  >  Article  >  Java  >  Explication détaillée de la différence entre sleep() et wait() en Java

Explication détaillée de la différence entre sleep() et wait() en Java

黄舟
黄舟original
2017-09-21 09:28:091554parcourir

Cet article présente principalement des informations pertinentes qui expliquent la différence entre sleep() et wait() en Java. J'espère que cet article pourra aider tout le monde. Les amis dans le besoin peuvent se référer à

pour une explication détaillée. La différence entre sleep() et wait() en Java

Pour la méthode sleep(), il faut d'abord savoir que cette méthode appartient à la classe Thread. La méthode wait() appartient à la classe Object. La méthode

sleep() amène le programme à suspendre l'exécution pendant une période de temps spécifiée, libérant ainsi le processeur pour d'autres threads. Cependant, son état de surveillance est toujours maintenu et il reprendra automatiquement son exécution lorsque le spécifié. Le temps s'est écoulé.

Pendant le processus d'appel de la méthode sleep(), le thread ne libérera pas le verrou de l'objet.

Lorsque la méthode wait() est appelée, le thread abandonnera le verrouillage de l'objet et entrera dans le pool de verrouillage en attente en attendant cet objet. Ce n'est qu'après l'appel de la méthode notify() pour cet objet que le thread le fera. entrez dans le pool de verrouillage d'objet pour préparer

Acquérir le verrouillage d'objet et entrer dans l'état d'exécution.

Qu'est-ce que cela signifie ?

Un exemple :


/**
 * 
 */
package com.b510.test;

/**
 * java中的sleep()和wait()的区别
 * @author Hongten Java学习交流QQ群:589809992 我们一起学Java!
 * @date 2013-12-10
 */
public class TestD {

  public static void main(String[] args) {
    new Thread(new Thread1()).start();
    try {
      Thread.sleep(5000);
    } catch (Exception e) {
      e.printStackTrace();
    }
    new Thread(new Thread2()).start();
  }

  private static class Thread1 implements Runnable{
    @Override
    public void run(){
      synchronized (TestD.class) {
      System.out.println("enter thread1...");  
      System.out.println("thread1 is waiting...");
      try {
        //调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
        TestD.class.wait();
      } catch (Exception e) {
        e.printStackTrace();
      }
      System.out.println("thread1 is going on ....");
      System.out.println("thread1 is over!!!");
      }
    }
  }

  private static class Thread2 implements Runnable{
    @Override
    public void run(){
      synchronized (TestD.class) {
        System.out.println("enter thread2....");
        System.out.println("thread2 is sleep....");
        //只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
        TestD.class.notify();
        //==================
        //区别
        //如果我们把代码:TestD.class.notify();给注释掉,即TestD.class调用了wait()方法,但是没有调用notify()
        //方法,则线程永远处于挂起状态。
        try {
          //sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,
          //但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
          //在调用sleep()方法的过程中,线程不会释放对象锁。
          Thread.sleep(5000);
        } catch (Exception e) {
          e.printStackTrace();
        }
        System.out.println("thread2 is going on....");
        System.out.println("thread2 is over!!!");
      }
    }
  }
}

Effet de l'opération :


enter thread1...
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over!!!
thread1 is going on ....
thread1 is over!!!

Si vous commentez le code :


1 TestD.class.notify();

l'effet d'exécution :


enter thread1...
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over!!!

et le programme se bloque toujours État.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn