Javawait,java wait notify原理

本文目錄一覽:

java wait和sleep的區別

sleep 是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復,調用sleep 不會釋放對象鎖。由於沒有釋放對象鎖,所以不能調用裡面的同步方法。

sleep()使當前線程進入停滯狀態(阻塞當前線程),讓出CUP的使用、目的是不讓當前線程獨自霸佔該進程所獲的CPU資源,以留一定時間給其他線程執行的機會;

sleep()是Thread類的Static(靜態)的方法;因此他不能改變對象的機鎖,所以當在一個Synchronized塊中調用Sleep()方法是,線程雖然休眠了,但是對象的機鎖並木有被釋放,其他線程無法訪問這個對象(即使睡著也持有對象鎖)。

在sleep()休眠時間期滿後,該線程不一定會立即執行,這是因為其它線程可能正在運行而且沒有被調度為放棄執行,除非此線程具有更高的優先順序。

wait()方法是Object類里的方法;當一個線程執行到wait()方法時,它就進入到一個和該對象相關的等待池中,同時失去(釋放)了對象的機鎖(暫時失去機鎖,wait(long timeout)超時時間到後還需要返還對象鎖);可以調用裡面的同步方法,其他線程可以訪問;

wait()使用notify或者notifyAlll或者指定睡眠時間來喚醒當前等待池中的線程。

wiat()必須放在synchronized block中,否則會在program runtime時扔出」java.lang.IllegalMonitorStateException「異常。

sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

sleep方法屬於Thread類中方法,表示讓一個線程進入睡眠狀態,等待一定的時間之後,自動醒來進入到可運行狀態,不會馬上進入運行狀態,因為線程調度機制恢複線程的運行也需要時間,一個線程對象調用了sleep方法之後,並不會釋放他所持有的所有對象鎖,所以也就不會影響其他進程對象的運行。但在sleep的過程中過程中有可能被其他對象調用它的interrupt(),產生InterruptedException異常,如果你的程序不捕獲這個異常,線程就會異常終止,進入TERMINATED狀態,如果你的程序捕獲了這個異常,那麼程序就會繼續執行catch語句塊(可能還有finally語句塊)以及以後的代碼。

注意sleep()方法是一個靜態方法,也就是說他只對當前對象有效,通過t.sleep()讓t對象進入sleep,這樣的做法是錯誤的,它只會是使當前線程被sleep 而不是t線程

wait屬於Object的成員方法,一旦一個對象調用了wait方法,必須要採用notify()和notifyAll()方法喚醒該進程;如果線程擁有某個或某些對象的同步鎖,那麼在調用了wait()後,這個線程就會釋放它持有的所有同步資源,而不限於這個被調用了wait()方法的對象。wait()方法也同樣會在wait的過程中有可能被其他對象調用interrupt()方法而產生

這兩者的施加者是有本質區別的.

sleep()是讓某個線程暫停運行一段時間,其控制範圍是由當前線程決定,也就是說,在線程裡面決定.好比如說,我要做的事情是 “點火-燒水-煮麵”,而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於運行的主動權是由我的流程來控制.

支持一下吆 收藏一下: 很好

而wait(),首先,這是由某個確定的對象來調用的,將這個對象理解成一個傳話的人,當這個人在某個線程裡面說”暫停!”,也是 thisOBJ.wait(),這裡的暫停是阻塞,還是”點火-燒水-煮飯”,thisOBJ就好比一個監督我的人站在我旁邊,本來該線 程應該執行1後執行2,再執行3,而在2處被那個對象喊暫停,那麼我就會一直等在這裡而不執行3,但正個流程並沒有結束,我一直想去煮飯,但還沒被允許, 直到那個對象在某個地方說”通知暫停的線程啟動!”,也就是thisOBJ.notify()的時候,那麼我就可以煮飯了,這個被暫停的線程就會從暫停處 繼續執行.

其實兩者都可以讓線程暫停一段時間,但是本質的區別是一個線程的運行狀態控制,一個是線程之間的通訊的問題

在java.lang.Thread類中,提供了sleep(),

而java.lang.Object類中提供了wait(), notify()和notifyAll()方法來操作線程

sleep()可以將一個線程睡眠,參數可以指定一個時間。

而wait()可以將一個線程掛起,直到超時或者該線程被喚醒。

wait有兩種形式wait()和wait(milliseconds).

sleep和wait的區別有:

1,這兩個方法來自不同的類分別是Thread和Object

2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。

3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在

任何地方使用

synchronized(x){

x.notify()

//或者wait()

}

4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

java中wait方法怎麼條用

wait方法用在 synchronized 方法或者 synchronized塊中。一般在判斷語句中,如果某條件被觸發,讓當前線程wait並釋放對象的鎖。此時可以讓其他線程可以對用以對象調用synchronized方法。直到調用 notify或者notifyAll後 wait的線程才有可能執行。所以一般wait 和 notify是成對出現的。

java線程wait方法

wait和notify是用在多線程競爭同一鎖資源的情況下使用的。

你這段代碼實際是個單線程,這個線程自己把自己阻塞了,自然不可能自己把自己喚醒。

你的意圖怎麼實現呢?需要加入另外一個線程,下面是我仿照你的意圖寫的一段代碼,供參考下

public class A

{

    public A(){

        final A a = this;

        Thread th1 = new Thread(){

            @Override

            public void run(){

                //一直循環,去嘗試著喚醒a

                try

                {

                    this.sleep(10000);

                } catch (InterruptedException e)

                {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }//為檢查是不是能真正實現喚醒a,等待10000毫秒,此時保證a已經處於等待狀態中。

                while(true){

                    /**

                     * 用notify喚醒的線程必須是持有當前鎖對象的線程

                     */

                    synchronized (a){

                        a.notify();

                    }

                }

            }

        };

        th1.setDaemon(true);//這句也是必須的,將th1設為守護線程,保證在喚醒a以後,所有活動的線程都為守護線程,jvm能及時推出

        th1.start();//和a.run的順序不可以換

        this.run();

    }

    

    public static void main(String[] args)

    {

        new A();

    }

    public void run()

    {

        /**

         * 這裡可以換成這樣,直接鎖住this就行了

         */

        synchronized (this)

        {

            try

            {

                

                this.wait();//阻塞當前的線程

            } catch (InterruptedException e)

            {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }finally{

                System.out.println(“1”);//執行finally

            }

        }

        

        

    }

    

}

java wait的用法

wait是Object的方法,也就是說可以對任意一個對象調用wait方法,調用wait方法將會將調用者的線程掛起,直到其他線程調用同一個對象的notify方法才會重新激活調用者,例如:

//Thread 1

try{

obj.wait();//suspend thread until obj.notify() is called

}

catch(InterrputedException e) {

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/155164.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-17 02:38
下一篇 2024-11-17 02:38

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29

發表回復

登錄後才能評論