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

Java中Object.wait()和LockSupport.park()的用法

 更新時間:2024年05月16日 10:54:42   作者:杉斯狼  
Object.wait()和LockSupport.park()都是用來使當前線程等待的方法,本文主要介紹了Java中Object.wait()和LockSupport.park()的用法,具有一定的參考價值,感興趣的可以了解一下

Object.wait() 和 LockSupport.park() 都是用來使當前線程等待的方法,但它們在使用場景和機制上有所不同:

Object.wait()

  • 用途wait() 方法屬于對象監(jiān)視器(Monitor)的一部分,通常與 synchronized 塊或方法一起使用。當線程調用某個對象的 wait() 方法時,它會釋放該對象的鎖,并使自己進入等待狀態(tài),直到其他線程調用該對象的 notify() 或 notifyAll() 方法喚醒它,此時線程會重新嘗試獲取鎖并繼續(xù)執(zhí)行。

  • 位置限制:只能在同步代碼塊或同步方法中調用,因為需要先獲取到對象的監(jiān)視器鎖。

  • 喚醒條件:可以被 notify() 喚醒,意味著有一個或多個等待線程會被喚醒,但具體哪個線程被喚醒是不確定的;也可以被 notifyAll() 喚醒,這時所有等待該對象監(jiān)視器的線程都會進入鎖的競爭狀態(tài)。

LockSupport.park()

  • 用途park() 方法屬于 java.util.concurrent.locks.LockSupport 類,它提供了一種低級別的線程阻塞原語。它不需要與特定的鎖關聯(lián),可以在任何地方調用,使得線程阻塞。它通常與 unpark() 方法配對使用,后者可以喚醒一個調用了 park() 的線程。

  • 位置限制:沒有位置限制,可以在任何地方調用,不需要先獲取鎖。

  • 喚醒條件:調用 LockSupport.unpark(Thread thread) 方法可以直接喚醒目標線程,更加靈活和精確。它可以喚醒一個特定的線程,而無需競爭或不確定性。

  • 線程許可park() 和 unpark() 是基于每個線程的許可(permit)機制。初始時,每個線程沒有許可,調用 unpark() 會給指定線程添加一個許可,即使之前已經調用過 unpark() 給該線程添加了許可,再調用也不會造成影響(許可不會累積)。調用 park() 時,如果沒有許可,線程會阻塞,如果有許可,則消耗許可并繼續(xù)執(zhí)行。

總結來說,Object.wait() 更適合與同步代碼塊或方法一起使用,與對象的監(jiān)視器鎖緊密相關,適用于傳統(tǒng)的線程協(xié)作場景;而 LockSupport.park() 提供了一種更底層、更靈活的線程阻塞和喚醒機制,適用于更復雜的并發(fā)控制邏輯。

下面是分別使用 Object.wait() 和 LockSupport.park() 的簡單示例:

使用 Object.wait() 的例子

public class WaitNotifyExample {
    public static void main(String[] args) {
        final Object monitor = new Object();
        
        Thread waitingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (monitor) {
                    System.out.println(Thread.currentThread().getName() + " 開始等待");
                    try {
                        monitor.wait(); // 等待被喚醒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " 被喚醒");
                }
            }
        }, "WaitingThread");
        
        Thread notifierThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000); // 模擬一些工作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                synchronized (monitor) {
                    monitor.notify(); // 喚醒等待的線程
                    System.out.println(Thread.currentThread().getName() + " 發(fā)出了喚醒通知");
                }
            }
        }, "NotifierThread");
        
        waitingThread.start();
        notifierThread.start();
    }
}

使用 LockSupport.park() 的例子

import java.util.concurrent.locks.LockSupport;

public class ParkUnparkExample {
    public static void main(String[] args) {
        Thread waitingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " 開始等待");
                LockSupport.park(); // 阻塞當前線程
                System.out.println(Thread.currentThread().getName() + " 被喚醒");
            }
        }, "WaitingThread");
        
        Thread unparkerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000); // 模擬一些工作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                System.out.println(Thread.currentThread().getName() + " 準備喚醒線程");
                LockSupport.unpark(waitingThread); // 喚醒指定線程
            }
        }, "UnparkerThread");
        
        waitingThread.start();
        unparkerThread.start();
    }
}

在這兩個例子中,第一個展示了如何使用 Object.wait() 和 notify() 來實現(xiàn)線程間的等待與通知,第二個例子展示了如何使用 LockSupport.park() 和 unpark() 實現(xiàn)類似的線程控制功能,但更為靈活和獨立于特定鎖。

到此這篇關于Java中Object.wait()和LockSupport.park()的用法的文章就介紹到這了,更多相關Java Object.wait() LockSupport.park()內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mybatis 中Mapper使用package方式配置報錯的解決方案

    Mybatis 中Mapper使用package方式配置報錯的解決方案

    這篇文章主要介紹了Mybatis 中Mapper使用package方式配置報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java垃圾回收機制簡述

    Java垃圾回收機制簡述

    這篇文章主要為大家詳細介紹了Java垃圾回收機制的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • springAOP的三種實現(xiàn)方式示例代碼

    springAOP的三種實現(xiàn)方式示例代碼

    這篇文章主要介紹了springAOP的三種實現(xiàn)方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot 如何從配置文件讀取值到對象中

    SpringBoot 如何從配置文件讀取值到對象中

    這篇文章主要介紹了SpringBoot 如何從配置文件讀取值到對象中,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java如何通過反射將map轉換為實體對象

    Java如何通過反射將map轉換為實體對象

    在Java開發(fā)中,常需要將XML配置數(shù)據轉為Map,并最終映射到實體對象上,通過單例模式管理XML轉換后的Map,并利用Java反射機制,通過屬性名稱匹配將Map的值賦給實體對象的對應屬性,這種方法忽略了數(shù)據類型轉換,適用于數(shù)據類型一致的簡單場景,需要類型轉換時
    2024-09-09
  • Java微信公眾平臺開發(fā)(9) 關鍵字回復以及客服接口實現(xiàn)

    Java微信公眾平臺開發(fā)(9) 關鍵字回復以及客服接口實現(xiàn)

    這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第九步,關鍵字回復以及客服接口實現(xiàn),以及遇到該公眾號暫時無法提供服務的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • java如何對接企業(yè)微信的實現(xiàn)步驟

    java如何對接企業(yè)微信的實現(xiàn)步驟

    本文主要介紹了java如何對接企業(yè)微信的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • MyBatis-Plus 如何單元測試的實現(xiàn)

    MyBatis-Plus 如何單元測試的實現(xiàn)

    這篇文章主要介紹了MyBatis-Plus 如何單元測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 深入理解Spring中bean的生命周期介紹

    深入理解Spring中bean的生命周期介紹

    本篇文章主要介紹了深入理解Spring中bean的生命周期介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java中左移和右移問題圖文詳解

    Java中左移和右移問題圖文詳解

    左移和右移并不常用,在一些特殊情況下才會使用,比如加解密時,會大量用到,這篇文章主要給大家介紹了關于Java中左移和右移問題的相關資料,需要的朋友可以參考下
    2021-11-11

最新評論