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

Lock、Condition實(shí)現(xiàn)簡(jiǎn)單的生產(chǎn)者消費(fèi)者模式示例

 更新時(shí)間:2014年04月16日 09:29:38   作者:  
這篇文章主要介紹了Lock、Condition實(shí)現(xiàn)簡(jiǎn)單的生產(chǎn)者消費(fèi)者模式示例,需要的朋友可以參考下

復(fù)制代碼 代碼如下:

package condition;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * 利用Lock、Condition實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式
 * @author will
 *
 */
public class ProducerConsumerDemo {

 public static void main(String[] args) {
  int producerCount = 10;
  int consumerCount = 15;

  final ProducerConsumerDemo pcd = new ProducerConsumerDemo(5);   // 緩沖區(qū)大小為5

  Thread[] producerThreads = new Thread[producerCount];
  for(int i = 0; i < producerCount; i++) {
   producerThreads[i] = new Thread("producer" + (i+1)) {

    @Override
    public void run() {
     pcd.produce();
    }
   };
  }

  Thread[] consumerThreads = new Thread[consumerCount];
  for(int j = 0; j < consumerCount; j++) {
   consumerThreads[j] = new Thread("consumer" + (j+1)) {
    @Override
    public void run() {
     pcd.consume();
    }
   };
  }

  // 啟動(dòng)生產(chǎn)者消費(fèi)者線程
  for(int i = 0; i < producerCount; i++) {
   producerThreads[i].start();
  }
  for(int j = 0; j < consumerCount; j++) {
   consumerThreads[j].start();
  }
 }

 private static final int DEFAULT_BUFFER_SIZE = 10;
 private int bufferSize;   // 緩沖區(qū)大小
 private List<Object> bufferList;

 private final Lock lock = new ReentrantLock(true);
 private final Condition condition = lock.newCondition();

 public ProducerConsumerDemo(int bufferSize) {
  this.bufferSize = bufferSize > 0 ? bufferSize : DEFAULT_BUFFER_SIZE;
  bufferList = new ArrayList<Object>(bufferSize);
 }

 // 生產(chǎn)
 public void produce() {
  lock.lock();   // 加鎖
  try {
   while(bufferList.size() == bufferSize) {   // 緩沖區(qū)滿了
    System.out.println("Producer wait, thread: " + Thread.currentThread().getName());
    condition.await();
   }

   // 生產(chǎn)
   bufferList.add(new Object());
   System.out.println("Producer produce one, now buffer size: "
     + bufferList.size() + ", and thread: " + Thread.currentThread().getName());
   condition.signalAll();   // 通知消費(fèi)者
  } catch(InterruptedException e) {
   e.printStackTrace();
  } finally {
   lock.unlock();
  }
 }

 // 消費(fèi)
 public void consume() {
  lock.lock();   // 加鎖
  try {
   while(bufferList.isEmpty()) {   // 緩沖區(qū)空了
    System.out.println("Consumer wait, thread: " + Thread.currentThread().getName());
    condition.await();
   }

   // 消費(fèi)
   bufferList.remove(0);   // 從鏈表頭部移除一個(gè)
   System.out.println("Consumer consumer one, now buffer size: "
     + bufferList.size() + ", and thread: " + Thread.currentThread().getName());
   condition.signalAll();
  } catch(InterruptedException e) {
   e.printStackTrace();
  } finally {
   lock.unlock();
  }
 }

}

相關(guān)文章

  • 如何使用Spring AOP預(yù)處理Controller的參數(shù)

    如何使用Spring AOP預(yù)處理Controller的參數(shù)

    這篇文章主要介紹了如何使用Spring AOP預(yù)處理Controller的參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程詳解

    intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程詳解

    這篇文章主要介紹了intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 如何使用java修改文件所有者及其權(quán)限

    如何使用java修改文件所有者及其權(quán)限

    這篇文章主要介紹了如何使用java修改文件所有者及其權(quán)限,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 詳解Spring DI依賴(lài)注入的方式和類(lèi)型

    詳解Spring DI依賴(lài)注入的方式和類(lèi)型

    這篇文章主要介紹了詳解Spring DI依賴(lài)注入的方式和類(lèi)型,DI是由容器動(dòng)態(tài)的將某個(gè)依賴(lài)關(guān)系注入到組件之中。依賴(lài)注入的目的并非為軟件系統(tǒng)帶來(lái)更多功能,而是為了提升組件重用的頻率,并為系統(tǒng)搭建一個(gè)靈活、可擴(kuò)展的平臺(tái),需要的朋友可以參考下
    2023-05-05
  • JDK動(dòng)態(tài)代理過(guò)程原理及手寫(xiě)實(shí)現(xiàn)詳解

    JDK動(dòng)態(tài)代理過(guò)程原理及手寫(xiě)實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了JDK動(dòng)態(tài)代理過(guò)程原理及手寫(xiě)實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java實(shí)現(xiàn)JSON與XML相互轉(zhuǎn)換的簡(jiǎn)明教程

    Java實(shí)現(xiàn)JSON與XML相互轉(zhuǎn)換的簡(jiǎn)明教程

    Java實(shí)現(xiàn)復(fù)雜數(shù)據(jù)結(jié)構(gòu)(如嵌套對(duì)象、數(shù)組)在 JSON 與 XML 之間的相互轉(zhuǎn)換,可以使用 Jackson 和 Jackson XML 擴(kuò)展庫(kù)來(lái)完成,Jackson 是一個(gè)流行的 JSON 處理庫(kù),通過(guò) Jackson 的 XML 擴(kuò)展庫(kù),可以實(shí)現(xiàn) JSON 和 XML 之間的轉(zhuǎn)換,需要的朋友可以參考下
    2024-08-08
  • SpringBoot-RestTemplate如何實(shí)現(xiàn)調(diào)用第三方API

    SpringBoot-RestTemplate如何實(shí)現(xiàn)調(diào)用第三方API

    這篇文章主要介紹了SpringBoot-RestTemplate實(shí)現(xiàn)調(diào)用第三方API的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot接口返回?cái)?shù)據(jù)類(lèi)型全面解析

    springboot接口返回?cái)?shù)據(jù)類(lèi)型全面解析

    這篇文章主要介紹了springboot接口返回?cái)?shù)據(jù)類(lèi)型問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Maven基礎(chǔ)之如何修改本地倉(cāng)庫(kù)的默認(rèn)路徑

    Maven基礎(chǔ)之如何修改本地倉(cāng)庫(kù)的默認(rèn)路徑

    這篇文章主要介紹了Maven基礎(chǔ)之如何修改本地倉(cāng)庫(kù)的默認(rèn)路徑問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringBoot整合Redis并且用Redis實(shí)現(xiàn)限流的方法 附Redis解壓包

    SpringBoot整合Redis并且用Redis實(shí)現(xiàn)限流的方法 附Redis解壓包

    這篇文章主要介紹了SpringBoot整合Redis并且用Redis實(shí)現(xiàn)限流的方法 附Redis解壓包,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評(píng)論

洛南县| 海南省| 合山市| 辉县市| 左贡县| 广河县| 乳源| 噶尔县| 元氏县| 钟祥市| 扶余县| 疏勒县| 上高县| 嘉黎县| 浮山县| 松江区| 岗巴县| 满洲里市| 宜兰县| 辽源市| 汪清县| 承德市| 海晏县| 和平区| 阿图什市| 黑龙江省| 正镶白旗| 台北县| 班玛县| 九寨沟县| 太和县| 北票市| 太白县| 砚山县| 灵璧县| 南涧| 仙游县| 汉川市| 长武县| 交城县| 普格县|