程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中sleep()與wait()的區別總結

Java中sleep()與wait()的區別總結

編輯:關於JAVA

前言

對於sleep()方法,我們首先要知道該方法是屬於Thread類中的。而wait()方法,則是屬於Object類中的。

sleep()方法導致了程序暫停執行指定的時間,讓出cpu該其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。

在調用sleep()方法的過程中,線程不會釋放對象鎖。

而當調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()方法後本線程才進入對象鎖定池准備

獲取對象鎖進入運行狀態。

什麼意思呢?

舉個列子說明:

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

/**
 * java中的sleep()和wait()的區別
 * @author Hongten
 * @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!!!");
   }
  }
 }
}

運行效果:

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

如果注釋掉代碼:

TestD.class.notify();

運行效果:

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

且程序一直處於掛起狀態。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對的支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved