最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java線程Thread.sleep()對(duì)比對(duì)象的wait示例解析

 更新時(shí)間:2023年09月28日 10:20:56   作者:趙KK日常技術(shù)記錄  
這篇文章主要為大家介紹了java線程Thread.sleep()對(duì)比對(duì)象的wait示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

java多線程

多線程編程是現(xiàn)代軟件開(kāi)發(fā)中的常見(jiàn)需求,而線程的控制和協(xié)作則是其中的關(guān)鍵挑戰(zhàn)之一。在Java中,有兩種主要的方法可以用來(lái)讓線程暫停執(zhí)行:Thread類的sleep()方法和對(duì)象的wait()方法。本文將深入研究這兩種方法,分析它們的區(qū)別,以及在不同情況下何時(shí)使用哪種方式來(lái)控制線程的執(zhí)行。

Thread.sleep() 方法

Thread.sleep()方法是Thread類的靜態(tài)方法,用于讓當(dāng)前線程休眠一段指定的時(shí)間。該方法接受一個(gè)毫秒數(shù)作為參數(shù),表示線程將休眠的時(shí)間長(zhǎng)度。在休眠期間,線程不會(huì)釋放它所持有的任何鎖,因此其他線程無(wú)法獲得這些鎖。

以下是一個(gè)簡(jiǎn)單的示例,演示了如何使用Thread.sleep()方法:

public class SleepExample {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Start of the program");
        Thread.sleep(2000); // 線程休眠2秒
        System.out.println("End of the program");
    }
}

在上面的示例中,主線程休眠了2秒后繼續(xù)執(zhí)行。

對(duì)象的 wait() 方法

wait()方法是Object類的方法,用于讓當(dāng)前線程等待,直到其他線程調(diào)用相同對(duì)象的notify()notifyAll()方法來(lái)喚醒它。wait()方法通常與synchronized關(guān)鍵字一起使用,以確保線程在等待期間釋放鎖,從而允許其他線程訪問(wèn)共享資源。

以下是一個(gè)示例,演示了如何使用wait()notify()方法來(lái)實(shí)現(xiàn)線程的協(xié)作:

public class WaitNotifyExample {
    public static void main(String[] args) {
        final Object lock = new Object();
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    System.out.println("Thread 1: Waiting...");
                    try {
                        lock.wait(); // 等待被喚醒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Thread 1: Resumed.");
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    System.out.println("Thread 2: Waking up Thread 1...");
                    lock.notify(); // 喚醒等待的線程
                }
            }
        });
        thread1.start();
        thread2.start();
    }
}

在上面的示例中,thread1等待被thread2喚醒,然后繼續(xù)執(zhí)行。

Thread.sleep() vs. 對(duì)象的 wait():區(qū)別對(duì)比

現(xiàn)在讓我們比較一下Thread.sleep()方法和對(duì)象的wait()方法的區(qū)別。

1. 暫停的對(duì)象不同:

  • Thread.sleep()方法是Thread類的方法,用于暫停當(dāng)前線程的執(zhí)行。
  • wait()方法是Object類的方法,用于暫停當(dāng)前線程,并釋放鎖,使其他線程可以訪問(wèn)相同對(duì)象的臨界區(qū)。

2. 使用場(chǎng)景不同:

  • Thread.sleep()通常用于暫停當(dāng)前線程的執(zhí)行,以模擬時(shí)間的流逝或?qū)崿F(xiàn)線程的定時(shí)等待。
  • wait()通常用于線程之間的協(xié)作,允許一個(gè)線程等待另一個(gè)線程的通知或信號(hào)。

3. 鎖的釋放情況不同:

  • Thread.sleep()不會(huì)釋放任何鎖,線程休眠期間其他線程無(wú)法獲得鎖。
  • wait()方法會(huì)釋放對(duì)象的鎖,讓其他線程有機(jī)會(huì)進(jìn)入對(duì)象的臨界區(qū)。

4. 喚醒方式不同:

  • Thread.sleep()不需要其他線程來(lái)喚醒,線程會(huì)在休眠時(shí)間結(jié)束后自動(dòng)恢復(fù)執(zhí)行。
  • wait()需要其他線程調(diào)用相同對(duì)象的notify()notifyAll()方法來(lái)喚醒等待的線程。

5. 異常處理不同:

  • Thread.sleep()可以拋出InterruptedException異常,需要進(jìn)行異常處理。
  • wait()方法也可以拋出InterruptedException異常,需要進(jìn)行異常處理。

示例代碼

讓我們繼續(xù)之前的示例,演示如何使用wait()notify()來(lái)實(shí)現(xiàn)線程的協(xié)作。

public class WaitNotifyExample {
    public static void main(String[] args) {
        final Object lock = new Object();
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    System.out.println("Thread 1: Waiting...");
                    try {
                        lock.wait(); // 等待被喚醒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Thread 1: Resumed.");
                }
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    try {
                        Thread.sleep(2000); // 等待2秒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Thread 2: Waking up Thread 1...");
                    lock.notify(); // 喚醒等待的線程
                }
            }
        });
        thread1.start();
        thread2.start();
    }
}

在這個(gè)續(xù)篇示例中,thread1使用wait()方法等待被thread2喚醒,而thread2使用Thread.sleep()方法休眠2秒后喚醒thread1。這個(gè)示例演示了Thread.sleep()wait()在協(xié)作中的不同用法。

結(jié)語(yǔ)

Thread.sleep()方法和對(duì)象的wait()方法都可以讓線程暫停執(zhí)行,但它們有不同的用途和行為。選擇哪種方式取決于你的需求和場(chǎng)景。希望本文能夠幫助你更好地理解這兩種方法的區(qū)別,以及如何在多線程編程中使用它們。

以上就是java線程Thread.sleep()對(duì)比對(duì)象的wait示例解析的詳細(xì)內(nèi)容,更多關(guān)于java線程Thread.sleep對(duì)象wait的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決Lombok使用@Builder無(wú)法build父類屬性的問(wèn)題

    解決Lombok使用@Builder無(wú)法build父類屬性的問(wèn)題

    這篇文章主要介紹了解決Lombok使用@Builder無(wú)法build父類屬性的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Spring:如何使用枚舉參數(shù)

    Spring:如何使用枚舉參數(shù)

    這篇文章主要介紹了springboot枚舉類型傳遞的步驟,幫助大家更好的理解和學(xué)習(xí)使用springboot,感興趣的朋友可以了解下,希望能給你帶來(lái)幫助
    2021-08-08
  • JDK的下載、安裝與部署圖文教程

    JDK的下載、安裝與部署圖文教程

    這篇文章主要為大家詳細(xì)介紹了JDK的下載、安裝與部署圖文教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Feign利用自定義注解實(shí)現(xiàn)路徑轉(zhuǎn)義詳解

    Feign利用自定義注解實(shí)現(xiàn)路徑轉(zhuǎn)義詳解

    這篇文章主要講解一下如何通過(guò)注解實(shí)現(xiàn)對(duì)路由中的路徑進(jìn)行自定義編碼,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下
    2022-06-06
  • 用java實(shí)現(xiàn)跳動(dòng)的小球示例代碼

    用java實(shí)現(xiàn)跳動(dòng)的小球示例代碼

    這篇文章主要介紹了用java實(shí)現(xiàn)跳動(dòng)的小球,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • SpringAop的依賴注入方式

    SpringAop的依賴注入方式

    文章介紹了Spring框架的依賴注入(DI)和面向切面編程(AOP)的基本概念和實(shí)現(xiàn)方式,Spring通過(guò)IOC容器管理Bean的創(chuàng)建和依賴注入,并提供了多種AOP實(shí)現(xiàn)方式,包括代理機(jī)制和配置選項(xiàng)
    2025-02-02
  • 詳解spring boot starter redis配置文件

    詳解spring boot starter redis配置文件

    spring-boot-starter-Redis主要是通過(guò)配置RedisConnectionFactory中的相關(guān)參數(shù)去實(shí)現(xiàn)連接redis service。下面通過(guò)本文給大家介紹在spring boot的配置文件中redis的基本配置,需要的的朋友參考下
    2017-07-07
  • Springboot整合ActiveMQ實(shí)現(xiàn)消息隊(duì)列的過(guò)程淺析

    Springboot整合ActiveMQ實(shí)現(xiàn)消息隊(duì)列的過(guò)程淺析

    昨天仔細(xì)研究了activeMQ消息隊(duì)列,也遇到了些坑,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合ActiveMQ的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 詳解Log4j 日志文件存放位置設(shè)置

    詳解Log4j 日志文件存放位置設(shè)置

    這篇文章主要介紹了詳解Log4j 日志文件存放位置設(shè)置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Java中如何獲取文件的上級(jí)目錄

    Java中如何獲取文件的上級(jí)目錄

    這篇文章主要介紹了Java中如何獲取文件的上級(jí)目錄問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論

城步| 望城县| 绥江县| 新乡市| 鄂尔多斯市| 黑水县| 交城县| 武威市| 大埔县| 盖州市| 吉安县| 镇康县| 吉水县| 合肥市| 湛江市| 凯里市| 灯塔市| 沅江市| 樟树市| 许昌县| 万安县| 青阳县| 雷山县| 辛集市| 石泉县| 兰坪| 五台县| 准格尔旗| 武宁县| 枝江市| 景东| 丰宁| 海伦市| 浦县| 武威市| 洞口县| 成安县| 射洪县| 项城市| 锡林浩特市| 桦南县|