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

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

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

復制代碼 代碼如下:

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實現(xiàn)生產(chǎn)者消費者模式
 * @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();
    }
   };
  }

  // 啟動生產(chǎn)者消費者線程
  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();   // 通知消費者
  } catch(InterruptedException e) {
   e.printStackTrace();
  } finally {
   lock.unlock();
  }
 }

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

   // 消費
   bufferList.remove(0);   // 從鏈表頭部移除一個
   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();
  }
 }

}

相關文章

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

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

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

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

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

    如何使用java修改文件所有者及其權限

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

    詳解Spring DI依賴注入的方式和類型

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

    JDK動態(tài)代理過程原理及手寫實現(xiàn)詳解

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

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

    Java實現(xiàn)復雜數(shù)據(jù)結構(如嵌套對象、數(shù)組)在 JSON 與 XML 之間的相互轉換,可以使用 Jackson 和 Jackson XML 擴展庫來完成,Jackson 是一個流行的 JSON 處理庫,通過 Jackson 的 XML 擴展庫,可以實現(xiàn) JSON 和 XML 之間的轉換,需要的朋友可以參考下
    2024-08-08
  • SpringBoot-RestTemplate如何實現(xiàn)調用第三方API

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

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

    springboot接口返回數(shù)據(jù)類型全面解析

    這篇文章主要介紹了springboot接口返回數(shù)據(jù)類型問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Maven基礎之如何修改本地倉庫的默認路徑

    Maven基礎之如何修改本地倉庫的默認路徑

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

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

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

最新評論

安西县| 清涧县| 西乡县| 聂荣县| 阿克苏市| 讷河市| 台山市| 九龙县| 温宿县| 浦东新区| 泉州市| 南川市| 越西县| 临沧市| 微博| 新竹市| 五寨县| 大名县| 寻乌县| 新乡县| 青海省| 平陆县| 旅游| 乡城县| 凤阳县| 涞源县| 西乌珠穆沁旗| 霍林郭勒市| 郁南县| 枣庄市| 如皋市| 道真| 肇庆市| 葵青区| 凤凰县| 将乐县| 青龙| 吉首市| 兴国县| 忻城县| 台东县|