Heim  >  Artikel  >  Java  >  Detaillierte Erklärung des Unterschieds zwischen Sleep() und Wait() in Java

Detaillierte Erklärung des Unterschieds zwischen Sleep() und Wait() in Java

黄舟
黄舟Original
2017-09-21 09:28:091554Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen vorgestellt, die den Unterschied zwischen sleep() und wait() in Java erklären. Ich hoffe, dass dieser Artikel allen Freunden in Not helfen kann, die eine detaillierte Erklärung erhalten Der Unterschied zwischen Sleep() und Wait() in Java

Für die Sleep()-Methode müssen wir zunächst wissen, dass diese Methode zur Thread-Klasse gehört. Die Methode wait() gehört zur Klasse Object. Die

sleep()-Methode bewirkt, dass das Programm die Ausführung für einen bestimmten Zeitraum unterbricht, wodurch die CPU für andere Threads frei wird. Der Überwachungsstatus bleibt jedoch weiterhin erhalten und die Ausführung wird automatisch fortgesetzt, wenn der angegebene Zeitraum erreicht ist Die Zeit ist um.

Während des Aufrufs der Sleep()-Methode gibt der Thread die Objektsperre nicht frei.

Wenn die Methode wait() aufgerufen wird, gibt der Thread die Objektsperre auf und tritt in den Wartesperrenpool ein, der auf dieses Objekt wartet. Erst nachdem die Methode notify() für dieses Objekt aufgerufen wurde, wird der Thread dies tun Geben Sie den Objektsperrenpool ein, um ihn vorzubereiten

Erhalten Sie die Objektsperre und wechseln Sie in den Betriebszustand.

Was bedeutet das?

Ein Beispiel:


Betriebseffekt:

/**
 * 
 */
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!!!");
      }
    }
  }
}


Wenn Sie Kommentieren Sie den Code aus:

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


den Laufeffekt:

1 TestD.class.notify();


und das Programm hängt immer Zustand.

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Unterschieds zwischen Sleep() und Wait() in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn