欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

Thread.sleep() 方法

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

以下是一個(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()方法來喚醒它。wait()方法通常與synchronized關(guān)鍵字一起使用,以確保線程在等待期間釋放鎖,從而允許其他線程訪問共享資源。

以下是一個(gè)示例,演示了如何使用wait()notify()方法來實(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)前線程,并釋放鎖,使其他線程可以訪問相同對(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ì)釋放任何鎖,線程休眠期間其他線程無法獲得鎖。
  • wait()方法會(huì)釋放對(duì)象的鎖,讓其他線程有機(jī)會(huì)進(jìn)入對(duì)象的臨界區(qū)。

4. 喚醒方式不同:

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

5. 異常處理不同:

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

示例代碼

讓我們繼續(xù)之前的示例,演示如何使用wait()notify()來實(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é)語

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)文章

  • Spring中的接口重試機(jī)制解析

    Spring中的接口重試機(jī)制解析

    這篇文章主要介紹了Spring中的接口重試機(jī)制解析,大家在做項(xiàng)目的時(shí)候,往往會(huì)遇到一些接口由于網(wǎng)絡(luò)抖動(dòng)等問題導(dǎo)致接口響應(yīng)超時(shí)等,這時(shí)候我們會(huì)希望能夠按照一定的規(guī)則進(jìn)行接口請(qǐng)求重試,需要的朋友可以參考下
    2024-01-01
  • 一篇文章徹底理解SpringIOC、DI

    一篇文章徹底理解SpringIOC、DI

    這篇文章主要給大家介紹了關(guān)于對(duì)SpringIOC、DI的理解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 用IDEA如何打開文件夾

    用IDEA如何打開文件夾

    這篇文章主要介紹了用IDEA如何打開文件夾問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java 調(diào)用天氣Webservice詳解及實(shí)例代碼

    Java 調(diào)用天氣Webservice詳解及實(shí)例代碼

    這篇文章主要介紹了Java 調(diào)用天氣Webservice詳解及實(shí)例代碼的相關(guān)資料,這里附實(shí)例代碼,使用java 調(diào)用webservice 的小應(yīng)用,需要的朋友可以參考下
    2016-11-11
  • 使用Java反射獲取方法的全路徑名稱的步驟

    使用Java反射獲取方法的全路徑名稱的步驟

    Java反射是一個(gè)強(qiáng)大的特性,它允許程序在運(yùn)行時(shí)查詢和修改類的行為,反射可以用于實(shí)現(xiàn)很多高級(jí)功能,比如動(dòng)態(tài)代理、依賴注入等,本文將介紹如何使用Java反射來實(shí)現(xiàn)這一功能,需要的朋友可以參考下
    2024-07-07
  • Spring框架中@PostConstruct注解詳解

    Spring框架中@PostConstruct注解詳解

    在Spring項(xiàng)目經(jīng)常遇到@PostConstruct注解,下面這篇文章主要給大家介紹了關(guān)于Spring框架中@PostConstruct注解的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Java轉(zhuǎn)換解析中間帶有 “T“和“Z“ 的時(shí)間格式

    Java轉(zhuǎn)換解析中間帶有 “T“和“Z“ 的時(shí)間格式

    這篇文章主要給大家介紹了關(guān)于Java轉(zhuǎn)換解析中間帶有 “T“和“Z“ 的時(shí)間格式,相信很多小伙伴在時(shí)間格式轉(zhuǎn)換的時(shí)候非常頭疼,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 詳解java操作Redis數(shù)據(jù)庫的redis工具(RedisUtil,jedis工具JedisUtil,JedisPoolUtil)

    詳解java操作Redis數(shù)據(jù)庫的redis工具(RedisUtil,jedis工具JedisUtil,JedisPoo

    這篇文章主要介紹了java操作Redis數(shù)據(jù)庫的redis工具,包括RedisUtil,jedis工具JedisUtil,JedisPoolUtil工具,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • SpringBoot服務(wù)端數(shù)據(jù)校驗(yàn)過程詳解

    SpringBoot服務(wù)端數(shù)據(jù)校驗(yàn)過程詳解

    這篇文章主要介紹了SpringBoot服務(wù)端數(shù)據(jù)校驗(yàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring框架實(shí)現(xiàn)依賴注入的原理

    Spring框架實(shí)現(xiàn)依賴注入的原理

    依賴注入是由“依賴”和“注入”兩個(gè)詞匯組合而成,那么我們?cè)僖淮雾樚倜?,分別分析這兩個(gè)詞語,這篇文章主要介紹了Spring DI依賴注入詳解,需要的朋友可以參考下
    2023-04-04

最新評(píng)論