1. 程式人生 > >Java中sleep與wait的區別

Java中sleep與wait的區別

學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下:

1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),在sleep指定時間後CPU再回到該執行緒繼續往下執行(注意:sleep方法只讓出了CPU,而並不會釋放同步資源鎖!!!);wait()方法則是指當前執行緒讓自己暫時退讓出同步資源鎖,以便其他正在等待該資源的執行緒得到該資源進而執行,只有呼叫了notify()方法,之前呼叫wait()的執行緒才會解除wait狀態,可以去參與競爭同步資源鎖,進而得到執行。(注意:notify的作用相當於叫醒睡著的人,而並不會給他分配任務,就是說notify只是讓之前呼叫wait的執行緒有權利重新參與執行緒的排程

);

2、sleep()方法可以在任何地方使用;wait()方法則只能在同步方法或同步塊中使用;

3、sleep()是執行緒執行緒類(Thread)的方法,呼叫會暫停此執行緒指定的時間,但監控依然保持,不會釋放物件鎖,到時間自動恢復;wait()是Object的方法,呼叫會放棄物件鎖,進入等待佇列,待呼叫notify()/notifyAll()喚醒指定的執行緒或者所有執行緒,才會進入鎖池,不再次獲得物件鎖才會進入執行狀態;


public class MultiThread {



private static class Thread1 implements Runnable{
@Override
public void run() {
//由於 Thread1和下面Thread2內部run方法要用同一物件作為監視器,如果用this則Thread1和Threa2的this不是同一物件
//所以用MultiThread.class這個位元組碼物件,當前虛擬機器裡引用這個變數時指向的都是同一個物件
synchronized(MultiThread.class){
System.out.println("enter thread1 ...");
System.out.println("thread1 is waiting");

try{
//釋放鎖有兩種方式:(1)程式自然離開監視器的範圍,即離開synchronized關鍵字管轄的程式碼範圍
//(2)在synchronized關鍵字管轄的程式碼內部呼叫監視器物件的wait()方法。這裡使用wait方法
MultiThread.class.wait();
}catch(InterruptedException e){
e.printStackTrace();
}

System.out.println("thread1 is going on ...");
System.out.println("thread1 is being over!");
}
}

}

private static class Thread2 implements Runnable{
@Override
public void run() {
//notify方法並不釋放鎖,即使thread2呼叫了下面的sleep方法休息10ms,但thread1仍然不會執行
//因為thread2沒有釋放鎖,所以Thread1得不到鎖而無法執行
synchronized(MultiThread.class){
System.out.println("enter thread2 ...");
System.out.println("thread2 notify other thread can release wait status ...");
MultiThread.class.notify();
System.out.println("thread2 is sleeping ten millisecond ...");

try{
Thread.sleep(10);
}catch(InterruptedException e){
e.printStackTrace();
}

System.out.println("thread2 is going on ...");
System.out.println("thread2 is being over!");
}
}
}

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


new Thread(new Thread2()).start();
}


}

相關推薦

Javasleep()wait()區別

學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下:1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),在slee

Javasleep()wait()區別標記一下

學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下: 1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),

Javasleepwait區別

學習時正好碰到這兩個方法,就查閱相關資料,並通過程式實現,進行區別一下:1、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的執行緒主動讓出CPU(然後CPU就可以去執行其他任務),在sle

多執行緒同步sleepwait區別

1、函式 wait是Object的一個函式,指執行緒處於進入等待狀態,此時執行緒不佔用任何資源,不增加時間限制。wait可以被notify和notifyAll函式喚醒(這兩個也是Object的函

javasleepwait的不同

1,sleep()方法是屬於Thread類中的,wait()方法是屬於Object類中的 2,sleep()方法導致了程式暫停執行指定的時間,讓出cpu,給其他執行緒,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復執行狀態。 3,在呼叫sleep()方法的過程中,執行緒不會釋放物件

執行緒sleep()wait()的區別

對時間的指定。  1,sleep方法必須指定時間。  2,wait方法有過載形式,可以指定時間,也可以不指定時間。 對於執行權和鎖的操作.:  1,sleep():釋放執行權,不釋放鎖,因為肯定能醒,肯定可以恢復到臨時阻塞狀態。  2,wait():釋

Javasleep()和wait()的區別

對於sleep()方法,我們首先要知道該方法是屬於Thread類中的。而wait()方法,則是屬於Object類中的。 sleep()方法使得程式暫停執行指定的時間,讓出cpu給其他執行緒.在呼叫sleep()方法的過程中,執行緒不會釋放物件鎖,它的監控狀態依然保持著,當指

javaa++++a區別

demo div main highlight print class 結果 public 別了 java中a++與++a區別 a++與++a的區別,如果單獨使用沒有任何區別,如果在運算中就有區別了,a++是先運算在賦值,而++a是先賦值在運算!! class dem

sleep()wait()區別

執行緒問題的總結參考:https://blog.csdn.net/u012050154/article/details/509033261、每個物件都有一個鎖來控制同步訪問,Synchronized關鍵字可以和物件的鎖互動,來實現同步方法或同步塊。sleep()方法正在執行的

javaarrayListlinkedList區別

這個問題其實好早就想做筆記了,一次面試問到了, ArrayList與linkedList在效能上各有優缺點,都有各自的地方, 1.對ArrayList和LinkedList而言,在列表中末尾新增一個元素所花的開銷是固定的 2.在ArrayList中間插入一個元素或刪除一個元

JAVAextends implements區別

1. 在類的宣告中,通過關鍵字extends來建立一個類的子類。一個類通過關鍵字implements宣告自己使用一個或者多個介面。 extends 是繼承某個類, 繼承之後可以使用父類的方法, 也可以重寫父類的方法; implements 是實現多個介面, 介面的方法一般為

Java執行緒sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和區別

Java執行緒中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和區別從作業系統的角度講,os會維護一個ready queue(就緒的執行緒佇列)。並且在某一

多線程sleepwait區別,以及多線程的實現方式及原因,定時器--Timer

守護 驗證 取消 技術 方法 代碼 安全 接口 art 1. Java中sleep和wait的區別 ① 這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。 sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程裏調用b

201671010145 2016-2017-3《Java程序設計》Java對象的區別

import -c indent cin ria wid let isp ans 1.什麽是類呢? 書面語句:類是一種事物,或者一類相同物體的抽象.類是對一個或者幾個相似對象的描述,它把不同對象具有的共性抽象出來.也可以說類是同一類對象的原型. 例如:人就是一個類,因為它是

讓你徹底明白JAVA棧的區別

java程序 運行 一點 動態 自動變 key 空間 類型 lin 原文地址:http://www.2cto.com/kf/201302/190704.html 簡單的說: Java把內存劃分成兩種:一種是棧內存,一種是堆內存。 在函數中定義的一些基本類型的變量和對象的引用

Javafinal static final 修飾的常量的區別

評論 tin 產生 建立 dom code 隨機數 ren 使用 喵喵開車,新手上路,多多關照。有任何錯誤請在評論區指出。 ...........................................我是萬惡的分界線( ? ?ω?? )?.............

Javathissuper的區別以及用法

輸出結果 類構造 pan tex 成員變量 靜態 public 裏的 一個 super()用法 super()函數在子類構造函數中調用父類的構造函數時使用,必須要在構造函數的第一行。 1 class Animal { 2 public Anima

JavanextnextLine方法的區別

1. Java中的Scanner類中的方法next()與nextLine()都是吸取輸入控制檯輸入的字元 ①next()方法不會吸取字元前和後的空格/Tab,只吸取字元,開始吸取字元(字元前後不算) 直到遇到空格/Tab/回車擷取吸取 ②nextLine()吸取字元前後的空格/Tab鍵,回車鍵截

c#javabyte位元組的區別及轉換方法

在java中  byte的範圍在 [-128,127] 在C#中  byte的範圍在 [0,255] 所以 java程式與C#程式 進行資料傳輸的時候 要先把java的byte陣列轉換成在[0,255]範圍內的int型陣列a[];再把a[]進行加密得到字串str, 把字串

Java == 號equals()方法區別詳解

== 號與equals()方法區別這個問題在面試中經常被問到,如果你瞭解的不透徹,很容易被問蒙。下面我們來一起看看吧。 1.基本資料型別,也稱原始資料型別。byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙等號(==)