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

java多線程之wait(),notify(),notifyAll()的詳解分析

 更新時間:2013年06月04日 15:20:19   作者:  
本篇文章是對java多線程 wait(),notify(),notifyAll()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
wait(),notify(),notifyAll()不屬于Thread類,而是屬于Object基礎(chǔ)類,也就是說每個對象都有wait(),notify(),notifyAll()的功能.因為每個對象都有鎖,鎖是每個對象的基礎(chǔ),當(dāng)然操作鎖的方法也是最基礎(chǔ)了。

wait導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法,或被其他線程中斷。wait只能由持有對像鎖的線程來調(diào)用。

notify喚醒在此對象監(jiān)視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程(隨機(jī))。直到當(dāng)前的線程放棄此對象上的鎖,才能繼續(xù)執(zhí)行被喚醒的線程。同Wait方法一樣,notify只能由持有對像鎖的線程來調(diào)用.notifyall也一樣,不同的是notifyall會喚配所有在此對象鎖上等待的線程。
"只能由持有對像鎖的線程來調(diào)用"說明wait方法與notify方法必須在同步塊內(nèi)執(zhí)行,即synchronized(obj)之內(nèi).再者synchronized代碼塊內(nèi)沒有鎖是寸步不行的,所以線程要繼續(xù)執(zhí)行必須獲得鎖。相輔相成。
看一個很經(jīng)典的例子(生產(chǎn)者與消費者):
首先是消費者線程類:
復(fù)制代碼 代碼如下:

import java.util.List;
public class Consume implements Runnable {
 private List container = null;
 private int count;
 public Consume(List lst) {
  this.container = lst;
 }
 public void run() {
  while (true) {
   synchronized (container) {
    if (container.size() == 0) {
     try {
      container.wait();// 容器為空,放棄鎖,等待生產(chǎn)
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    try {
     Thread.sleep(1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    container.remove(0);
    container.notify();
    System.out.println("我吃了" + (++count) + "個");
   }
  }
 }
}

接下來是生產(chǎn)者線程類:
復(fù)制代碼 代碼如下:

import java.util.List;
public class Product implements Runnable {
 private List container = null;
 private int count;
 public Product(List lst) {
  this.container = lst;
 }
 public void run() {
  while (true) {
   synchronized (container) {
    if (container.size() > MultiThread.MAX) {
     // 如果容器超過了最大值,就不要在生產(chǎn)了,等待消費
     try {
      container.wait();
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
    try {
     Thread.sleep(1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    container.add(new Object());
    container.notify();
    System.out.println("我生產(chǎn)了" + (++count) + "個");
   }
  }
 }
}

最后是測試類:
復(fù)制代碼 代碼如下:

import java.util.ArrayList;
import java.util.List;
public class MultiThread {
 private List container = new ArrayList();
 public final static int MAX = 5;
 public static void main(String args[]) {
  MultiThread m = new MultiThread();
  new Thread(new Consume(m.getContainer())).start();
  new Thread(new Product(m.getContainer())).start();
 }
 public List getContainer() {
  return container;
 }
 public void setContainer(List container) {
  this.container = container;
 }
}

運(yùn)行結(jié)果如下所示:
復(fù)制代碼 代碼如下:

我生產(chǎn)了1個
我吃了1個
我生產(chǎn)了2個
我生產(chǎn)了3個
我生產(chǎn)了4個
我生產(chǎn)了5個
我生產(chǎn)了6個
我生產(chǎn)了7個
我吃了2個
我生產(chǎn)了8個
我吃了3個
我生產(chǎn)了9個
我吃了4個
我吃了5個
我吃了6個
我吃了7個
我吃了8個
我生產(chǎn)了10個
我生產(chǎn)了11個
我吃了9個
我生產(chǎn)了12個
我吃了10個
......

相關(guān)文章

  • Jpa使用Page和Pageable分頁遇到的問題及解決

    Jpa使用Page和Pageable分頁遇到的問題及解決

    這篇文章主要介紹了Jpa使用Page和Pageable分頁遇到的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java8新特性之精簡的JRE詳解_動力節(jié)點Java學(xué)院整理

    Java8新特性之精簡的JRE詳解_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了Java8新特性之精簡的JRE詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 幾種JAVA細(xì)粒度鎖的實現(xiàn)方式

    幾種JAVA細(xì)粒度鎖的實現(xiàn)方式

    這篇文章主要為大家詳細(xì)介紹了幾種JAVA細(xì)粒度鎖的實現(xiàn)方式,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 詳解IDEA多module項目maven依賴的一些說明

    詳解IDEA多module項目maven依賴的一些說明

    這篇文章主要介紹了詳解IDEA多module項目maven依賴的一些說明,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • SpringBoot項目URL訪問異常的問題處理

    SpringBoot項目URL訪問異常的問題處理

    這篇文章主要介紹了SpringBoot項目URL訪問異常的問題處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot之為何推薦使用構(gòu)造器注入

    SpringBoot之為何推薦使用構(gòu)造器注入

    這篇文章主要介紹了SpringBoot之為何推薦使用構(gòu)造器注入問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java文本編輯器實現(xiàn)方法詳解

    Java文本編輯器實現(xiàn)方法詳解

    這篇文章主要介紹了Java文本編輯器實現(xiàn)方法,結(jié)合實例形式詳細(xì)分析了java文本編輯器結(jié)構(gòu)、原理、布局、實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Java深入淺出講解多線程的概念到使用

    Java深入淺出講解多線程的概念到使用

    哈哈!經(jīng)過一個階段的學(xué)習(xí),Java基礎(chǔ)知識學(xué)習(xí)終于到多線程了!Java多線程以及后面互斥鎖的概念都是Java基礎(chǔ)學(xué)習(xí)的難點,所以我做了一個總結(jié),希望對大家也有幫助
    2022-05-05
  • 使用@Valid+BindingResult進(jìn)行controller參數(shù)校驗方式

    使用@Valid+BindingResult進(jìn)行controller參數(shù)校驗方式

    這篇文章主要介紹了使用@Valid+BindingResult進(jìn)行controller參數(shù)校驗方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • IDEA?隱藏DEBUG日志的解決方法

    IDEA?隱藏DEBUG日志的解決方法

    IDEA?打印太多的DEBUG日志,看起來很煩,有沒有辦法隱藏日志,網(wǎng)上找了一圈,沒有誰寫的靠譜的,下面小編給大家分享下IDEA?如何隱藏DEBUG日志,需要的朋友可以參考下
    2022-09-09

最新評論

太保市| 德惠市| 淳化县| 博野县| 舟山市| 太湖县| 深州市| 漾濞| 嘉黎县| 稻城县| 涞水县| 唐河县| 行唐县| 宁德市| 韶关市| 岐山县| 克山县| 鲁山县| 平凉市| 珲春市| 荆州市| 柳江县| 乃东县| 罗江县| 永城市| 富锦市| 观塘区| 道真| 敦化市| 司法| 汤阴县| 浑源县| 孟连| 丹寨县| 新津县| 临猗县| 云南省| 洪洞县| 常宁市| 南木林县| 贵阳市|