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

Java object wait notify notifyAll代碼解析

 更新時間:2020年11月18日 10:09:29   作者:dint  
這篇文章主要介紹了Java object wait notify notifyAll代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

測試代碼:

public static Object loc=new Object();

  public static void main(String[] args) throws Exception{

    Thread t1=new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          java.text.SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss SSS");
          System.out.println("["+sdf.format(new Date())+"] t1___等待鎖...");
          synchronized (loc) {
            System.out.println("["+sdf.format(new Date())+"] t1___獲得鎖 ...");
            Thread.sleep(5000);
            System.out.println("["+sdf.format(new Date())+"] t1___loc..開始執(zhí)行wait...");
            loc.wait();
            System.out.println("["+sdf.format(new Date())+"] t1___loc..執(zhí)行wait后續(xù)...");
            Thread.sleep(1000);
          }
          System.out.println("["+sdf.format(new Date())+"] t1___loc..離開鎖...");
        }catch (Exception e){
          e.printStackTrace();
        }
      }
    });
    Thread t3=new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          java.text.SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss SSS");
          System.out.println("["+sdf.format(new Date())+"] t3___等待鎖...");
          synchronized (loc) {
            System.out.println("["+sdf.format(new Date())+"] t3___進入鎖...");
            Thread.sleep(5000);
            System.out.println("["+sdf.format(new Date())+"] t3___loc..開始 wait...");
            loc.wait();
            System.out.println("["+sdf.format(new Date())+"] t3___loc..執(zhí)行 wait后續(xù)...");
            Thread.sleep(1000);
          }
          System.out.println("["+sdf.format(new Date())+"] t3___離開鎖...");
        }catch (Exception e){
          e.printStackTrace();
        }
      }
    });

    Thread t2=new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          java.text.SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss SSS");
          System.out.println("["+sdf.format(new Date())+"] t2___等待鎖...");
          synchronized (loc) {
            System.out.println("["+sdf.format(new Date())+"] t2___獲得鎖...");
            Thread.sleep(5000);
            System.out.println("["+sdf.format(new Date())+"] t2___loc..開始執(zhí)行 notify...");
            loc.notify();
            System.out.println("["+sdf.format(new Date())+"] t2___loc..執(zhí)行 notify后續(xù)...");
            Thread.sleep(1000);
          }
          System.out.println("["+sdf.format(new Date())+"] t2___loc 離開鎖....");
        }catch (Exception e){
          e.printStackTrace();
        }
      }
    });
    t1.start();
    t3.start();
    Thread.sleep(500);
    t2.start();


    System.out.println("t1___before join ....");
    t1.join();
    System.out.println("t2___before join ....");
    t2.join();
    System.out.println("t3____before join ....");
    t3.join();
    System.out.println("main exit....");
  }

執(zhí)行結(jié)果:

[16:55:59 384] t1___等待鎖...

[16:55:59 384] t1___獲得鎖 ...

[16:55:59 384] t3___等待鎖...
t1___before join ....
[16:55:59 836] t2___等待鎖...
[16:56:04 392] t1___loc..開始執(zhí)行wait...

[16:56:04 392] t2___獲得鎖...
[16:56:09 392] t2___loc..開始執(zhí)行 notify...
[16:56:09 392] t2___loc..執(zhí)行 notify后續(xù)...
[16:56:10 392] t2___loc 離開鎖....


[16:56:10 392] t3___進入鎖...
[16:56:15 392] t3___loc..開始 wait...
[16:56:15 392] t1___loc..執(zhí)行wait后續(xù)...
[16:56:16 392] t1___loc..離開鎖...
t2___before join ....
t3____before join ....

總結(jié):

1. 執(zhí)行wait后‘'暫時‘ 釋放當(dāng)前對象鎖給其他線程,當(dāng)前線程處于等待狀態(tài)

2. syn塊中的wait收到notify通知后 喚醒cpu 繼續(xù)判斷鎖狀態(tài)

3. 執(zhí)行notify且當(dāng)前的對象鎖釋放后 wait等待的線程激活

4. notifyAll 是一次喚醒所有的wait

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC之AbstractAnnotationConfigDispatcherSer解讀

    SpringMVC之AbstractAnnotationConfigDispatcherSer解讀

    這篇文章主要介紹了SpringMVC之AbstractAnnotationConfigDispatcherSer,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java字節(jié)碼指令集的使用詳細(xì)

    Java字節(jié)碼指令集的使用詳細(xì)

    本篇文章對Java字節(jié)碼指令集的使用進行了詳細(xì)的介紹。需要的朋友參考下
    2013-05-05
  • Java利用Map實現(xiàn)計算文本中字符個數(shù)

    Java利用Map實現(xiàn)計算文本中字符個數(shù)

    這篇文章主要為大家詳細(xì)介紹了Java如何利用Map集合實現(xiàn)計算文本中字符個數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • java線程池ThreadPoolExecutor的八種拒絕策略示例詳解

    java線程池ThreadPoolExecutor的八種拒絕策略示例詳解

    ThreadPoolExecutor是一個典型的緩存池化設(shè)計的產(chǎn)物,因為池子有大小,當(dāng)池子體積不夠承載時,就涉及到拒絕策略。JDK中已預(yù)設(shè)了?4?種線程池拒絕策略,下面結(jié)合場景詳細(xì)聊聊這些策略的使用場景以及還能擴展哪些拒絕策略
    2021-11-11
  • Json在Struts中的轉(zhuǎn)換與傳遞方法

    Json在Struts中的轉(zhuǎn)換與傳遞方法

    下面小編就為大家?guī)硪黄狫son在Struts中的轉(zhuǎn)換與傳遞方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • java注解的類型知識點總結(jié)

    java注解的類型知識點總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于java注解的類型知識點總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • 解決接口調(diào)用報錯newSocketStream(..)failed:Too?many?open?files問題

    解決接口調(diào)用報錯newSocketStream(..)failed:Too?many?open?files問題

    這篇文章主要介紹了解決接口調(diào)用報錯newSocketStream(..)failed:Too?many?open?files問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java中的Fork/Join框架使用詳解

    Java中的Fork/Join框架使用詳解

    這篇文章主要介紹了Java中的Fork/Join框架使用詳解,Fork/Join?框架:就是在必要的情況下,將一個大任務(wù),進行<BR>拆分(fork)成若干個小任務(wù)(拆到不可再拆時),再將一個個<BR>的小任務(wù)運算的結(jié)果進行?join?匯總,需要的朋友可以參考下
    2024-01-01
  • 基于Java實現(xiàn)互聯(lián)網(wǎng)實時聊天系統(tǒng)(附源碼)

    基于Java實現(xiàn)互聯(lián)網(wǎng)實時聊天系統(tǒng)(附源碼)

    Netty?是一個利用?Java?的高級網(wǎng)絡(luò)的能力,隱藏其背后的復(fù)雜性而提供一個易于使用的?API?的客戶端/服務(wù)器框架。本文將利用它實現(xiàn)互聯(lián)網(wǎng)實時聊天系統(tǒng),感興趣的可以了解一下
    2022-09-09
  • JAVA 實現(xiàn)磁盤文件加解密操作的示例代碼

    JAVA 實現(xiàn)磁盤文件加解密操作的示例代碼

    這篇文章主要介紹了JAVA 實現(xiàn)磁盤文件加解密操作的示例代碼,幫助大家利用Java實現(xiàn)文件的加解密,感興趣的朋友可以了解下
    2020-09-09

最新評論