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

Java如何通過線程解決生產(chǎn)者/消費者問題

 更新時間:2020年10月10日 10:55:28   作者:知優(yōu)碼  
這篇文章主要介紹了Java如何通過線程解決生產(chǎn)者/消費者問題,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

生產(chǎn)者和消費者問題是線程模型中的經(jīng)典問題:生產(chǎn)者和消費者在同一時間段內(nèi)共用同一個存儲空間,如下圖所示

生產(chǎn)者向空間里存放數(shù)據(jù),而消費者取用數(shù)據(jù),如果不加以協(xié)調(diào)可能會出現(xiàn)以下情況:

存儲空間已滿,而生產(chǎn)者占用著它,消費者等著生產(chǎn)者讓出空間從而去除產(chǎn)品,生產(chǎn)者等著消費者消費產(chǎn)品,從而向空間中添加產(chǎn)品?;ハ嗟却瑥亩l(fā)生死鎖。

以下實例演示了如何通過線程解決生產(chǎn)者/消費者問題:

/*
 author by javaidea.com
 ProducerConsumerTest.java
 */

public class ProducerConsumerTest {
  public static void main(String[] args) {
   CubbyHole c = new CubbyHole();
   Producer p1 = new Producer(c, 1);
   Consumer c1 = new Consumer(c, 1);
   p1.start(); 
   c1.start();
  }
}
class CubbyHole {
  private int contents;
  private boolean available = false;
  public synchronized int get() {
   while (available == false) {
     try {
      wait();
     }
     catch (InterruptedException e) {
     }
   }
   available = false;
   notifyAll();
   return contents;
  }
  public synchronized void put(int value) {
   while (available == true) {
     try {
      wait();
     }
     catch (InterruptedException e) { 
     } 
   }
   contents = value;
   available = true;
   notifyAll();
  }
}

class Consumer extends Thread {
  private CubbyHole cubbyhole;
  private int number;
  public Consumer(CubbyHole c, int number) {
   cubbyhole = c;
   this.number = number;
  }
  public void run() {
   int value = 0;
     for (int i = 0; i < 10; i++) {
      value = cubbyhole.get();
      System.out.println("消費者 #" + this.number+ " got: " + value);
     }
  }
}

class Producer extends Thread {
  private CubbyHole cubbyhole;
  private int number;

  public Producer(CubbyHole c, int number) {
   cubbyhole = c;
   this.number = number;
  }

  public void run() {
   for (int i = 0; i < 10; i++) {
     cubbyhole.put(i);
     System.out.println("生產(chǎn)者 #" + this.number + " put: " + i);
     try {
      sleep((int)(Math.random() * 100));
     } catch (InterruptedException e) { }
   }
  }
}

以上代碼運行輸出結(jié)果為:

消費者 #1 got: 0
生產(chǎn)者 #1 put: 0
生產(chǎn)者 #1 put: 1
消費者 #1 got: 1
生產(chǎn)者 #1 put: 2
消費者 #1 got: 2
生產(chǎn)者 #1 put: 3
消費者 #1 got: 3
生產(chǎn)者 #1 put: 4
消費者 #1 got: 4
生產(chǎn)者 #1 put: 5
消費者 #1 got: 5
生產(chǎn)者 #1 put: 6
消費者 #1 got: 6
生產(chǎn)者 #1 put: 7
消費者 #1 got: 7
生產(chǎn)者 #1 put: 8
消費者 #1 got: 8
生產(chǎn)者 #1 put: 9
消費者 #1 got: 9

以上就是Java如何通過線程解決生產(chǎn)者/消費者問題的詳細(xì)內(nèi)容,更多關(guān)于Java 解決生產(chǎn)者/消費者問題的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java使用正則獲取括號里面的內(nèi)容

    Java使用正則獲取括號里面的內(nèi)容

    這篇文章主要介紹了Java使用正則獲取括號里面的內(nèi)容問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java中的注解與注解處理器

    Java中的注解與注解處理器

    這篇文章主要介紹了Java中的注解與注解處理器,元注解的作用是負(fù)責(zé)注解其他注解, Java5.0定義了4個標(biāo)準(zhǔn)的meta-annotation(元注解)類型,它們被用來提供對其它注解類型進行說明,需要的朋友可以參考下
    2023-11-11
  • 簡單講解Java的Future編程模式

    簡單講解Java的Future編程模式

    這篇文章主要介紹了Java的Future編程模式,包括對異步和并發(fā)的一些設(shè)計思維,需要的朋友可以參考下
    2015-11-11
  • SpringBoot項目創(chuàng)建使用+配置文件+日志文件詳解

    SpringBoot項目創(chuàng)建使用+配置文件+日志文件詳解

    Spring的出現(xiàn)是為了簡化 Java 程序開發(fā),而 SpringBoot 的出現(xiàn)是為了簡化 Spring 程序開發(fā),這篇文章主要介紹了SpringBoot項目創(chuàng)建使用+配置文件+日志文件,需要的朋友可以參考下
    2023-02-02
  • MyBatis生成UUID的實現(xiàn)

    MyBatis生成UUID的實現(xiàn)

    這篇文章主要介紹了MyBatis生成UUID的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 面試突擊之跨域問題的解決方案詳解

    面試突擊之跨域問題的解決方案詳解

    跨域問題本質(zhì)是瀏覽器的一種保護機制,它的初衷是為了保證用戶的安全,防止惡意網(wǎng)站竊取數(shù)據(jù)。那怎么解決這個問題呢?接下來我們一起來看
    2022-09-09
  • Mybatis 返回值類型和參數(shù)傳遞的配置方法

    Mybatis 返回值類型和參數(shù)傳遞的配置方法

    在 MyBatis 中,返回值類型和參數(shù)傳遞是 Mapper 接口中至關(guān)重要的兩個方面,正確理解和使用它們可以幫助我們高效、準(zhǔn)確地進行數(shù)據(jù)庫操作,接下來通過本文給大家介紹Mybatis 返回值類型和參數(shù)傳遞的配置方法,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Java重載構(gòu)造原理與用法詳解

    Java重載構(gòu)造原理與用法詳解

    這篇文章主要介紹了Java重載構(gòu)造原理與用法,結(jié)合實例形式分析了java可變參數(shù)、方法重載、構(gòu)造器等相關(guān)概念、原理及操作注意事項,需要的朋友可以參考下
    2020-02-02
  • spring security中的默認(rèn)登錄頁源碼跟蹤

    spring security中的默認(rèn)登錄頁源碼跟蹤

    原來Spring Security有一個默認(rèn)的WebSecurityConfigurerAdapter,發(fā)現(xiàn)其中有一個init方法,于是在這個方法打了斷點,在應(yīng)用啟動的時候進行跟蹤,這篇文章主要介紹了spring security之 默認(rèn)登錄頁源碼跟蹤,需要的朋友可以參考下
    2021-11-11
  • Java使用異或運算實現(xiàn)簡單的加密解密算法實例代碼

    Java使用異或運算實現(xiàn)簡單的加密解密算法實例代碼

    這篇文章主要介紹了Java使用異或運算實現(xiàn)簡單的加密解密算法實例代碼,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12

最新評論

安新县| 林西县| 延吉市| 淳化县| 江津市| 安徽省| 恩平市| 清原| 攀枝花市| 邹平县| 会东县| 永寿县| 伊金霍洛旗| 准格尔旗| 鄂伦春自治旗| 定陶县| 邵武市| 拉萨市| 横峰县| 孝昌县| 辽宁省| 图木舒克市| 东乡县| 锡林浩特市| 长武县| 和顺县| 白玉县| 安平县| 上犹县| 连南| 建阳市| 宁晋县| 合川市| 苗栗县| 万州区| 龙胜| 来安县| 光山县| 平凉市| 桑植县| 柳林县|