自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java多線程之消費(fèi)者生產(chǎn)者模式

開發(fā) 后端
這個(gè)實(shí)例應(yīng)該是學(xué)習(xí)線程的一個(gè)經(jīng)典例子,生產(chǎn)者和消費(fèi)者模式。代碼寫的很好,詳細(xì)請看內(nèi)容。
  1. /*@author shijin  
  2. * 生產(chǎn)者與消費(fèi)者模型中,要保證以下幾點(diǎn):  
  3. * 1 同一時(shí)間內(nèi)只能有一個(gè)生產(chǎn)者生產(chǎn)     生產(chǎn)方法加鎖sychronized  
  4. * 2 同一時(shí)間內(nèi)只能有一個(gè)消費(fèi)者消費(fèi)     消費(fèi)方法加鎖sychronized  
  5. * 3 生產(chǎn)者生產(chǎn)的同時(shí)消費(fèi)者不能消費(fèi)     生產(chǎn)方法加鎖sychronized  
  6. * 4 消費(fèi)者消費(fèi)的同時(shí)生產(chǎn)者不能生產(chǎn)     消費(fèi)方法加鎖sychronized  
  7. * 5 共享空間空時(shí)消費(fèi)者不能繼續(xù)消費(fèi)     消費(fèi)前循環(huán)判斷是否為空,空的話將該線程wait,釋放鎖允許其他同步方法執(zhí)行  
  8. * 6 共享空間滿時(shí)生產(chǎn)者不能繼續(xù)生產(chǎn)     生產(chǎn)前循環(huán)判斷是否為滿,滿的話將該線程wait,釋放鎖允許其他同步方法執(zhí)行     
  9. */ 
  10.  
  11. //主類  
  12. class  ProducerConsumer  
  13. {  
  14.     public static void main(String[] args)   
  15.     {  
  16.         StackBasket s = new StackBasket();  
  17.         Producer p = new Producer(s);  
  18.         Consumer c = new Consumer(s);  
  19.         Thread tp = new Thread(p);  
  20.         Thread tc = new Thread(c);  
  21.         tp.start();  
  22.         tc.start();  
  23.     }  
  24. }  
  25.  
  26. //  
  27. class Mantou  
  28. {  
  29.     private int id;  
  30.       
  31.     Mantou(int id){  
  32.         this.id = id;  
  33.     }  
  34.  
  35.     public String toString(){  
  36.         return "Mantou :" + id;  
  37.     }  
  38. }  
  39.  
  40. //共享?xiàng)?臻g  
  41. class StackBasket  
  42. {  
  43.     Mantou sm[] = new Mantou[6];  
  44.     int index = 0;  
  45.       
  46.     /**   
  47.     * show 生產(chǎn)方法.  
  48.     * show 該方法為同步方法,持有方法鎖;  
  49.     * show 首先循環(huán)判斷滿否,滿的話使該線程等待,釋放同步方法鎖,允許消費(fèi);  
  50.     * show 當(dāng)不滿時(shí)首先喚醒正在等待的消費(fèi)方法,但是也只能讓其進(jìn)入就緒狀態(tài),  
  51.     * show 等生產(chǎn)結(jié)束釋放同步方法鎖后消費(fèi)才能持有該鎖進(jìn)行消費(fèi)  
  52.     * @param m 元素  
  53.     * @return 沒有返回值   
  54.     */   
  55.  
  56.     public synchronized void push(Mantou m){  
  57.         try{  
  58.             while(index == sm.length){  
  59.                 System.out.println("!!!!!!!!!生產(chǎn)滿了!!!!!!!!!");  
  60.                 this.wait();  
  61.             }  
  62.             this.notify();  
  63.         }catch(InterruptedException e){  
  64.             e.printStackTrace();  
  65.         }catch(IllegalMonitorStateException e){  
  66.             e.printStackTrace();  
  67.         }  
  68.           
  69.         sm[index] = m;  
  70.         index++;  
  71.         System.out.println("生產(chǎn)了:" + m + " 共" + index + "個(gè)饅頭");  
  72.     }  
  73.  
  74.     /**   
  75.     * show 消費(fèi)方法  
  76.     * show 該方法為同步方法,持有方法鎖  
  77.     * show 首先循環(huán)判斷空否,空的話使該線程等待,釋放同步方法鎖,允許生產(chǎn);  
  78.     * show 當(dāng)不空時(shí)首先喚醒正在等待的生產(chǎn)方法,但是也只能讓其進(jìn)入就緒狀態(tài)  
  79.     * show 等消費(fèi)結(jié)束釋放同步方法鎖后生產(chǎn)才能持有該鎖進(jìn)行生產(chǎn)  
  80.     * @param b true 表示顯示,false 表示隱藏   
  81.     * @return 沒有返回值   
  82.     */   
  83.     public synchronized Mantou pop(){  
  84.         try{  
  85.             while(index == 0){  
  86.                 System.out.println("!!!!!!!!!消費(fèi)光了!!!!!!!!!");  
  87.                 this.wait();  
  88.             }  
  89.             this.notify();  
  90.         }catch(InterruptedException e){  
  91.             e.printStackTrace();  
  92.         }catch(IllegalMonitorStateException e){  
  93.             e.printStackTrace();  
  94.         }  
  95.         index--;  
  96.         System.out.println("消費(fèi)了:---------" + sm[index] + " 共" + index + "個(gè)饅頭");  
  97.         return sm[index];  
  98.     }  
  99. }  
  100.  
  101. class Producer implements Runnable  
  102. {  
  103.     StackBasket ss = new StackBasket();  
  104.     Producer(StackBasket ss){  
  105.         this.ss = ss;  
  106.     }  
  107.  
  108.     /**   
  109.     * show 生產(chǎn)進(jìn)程.   
  110.     */   
  111.     public void run(){  
  112.         for(int i = 0;i < 20;i++){  
  113.             Mantou m = new Mantou(i);  
  114.             ss.push(m);  
  115. //          System.out.println("生產(chǎn)了:" + m + " 共" + ss.index + "個(gè)饅頭");  
  116. //          在上面一行進(jìn)行測試是不妥的,對index的訪問應(yīng)該在原子操作里,因?yàn)榭赡茉趐ush之后此輸出之前又消費(fèi)了,會產(chǎn)生輸出混亂  
  117.             try{  
  118.                 Thread.sleep((int)(Math.random()*500));  
  119.             }catch(InterruptedException e){  
  120.                 e.printStackTrace();  
  121.             }  
  122.         }  
  123.     }  
  124. }  
  125.  
  126. class Consumer implements Runnable  
  127. {  
  128.     StackBasket ss = new StackBasket();  
  129.     Consumer(StackBasket ss){  
  130.         this.ss = ss;  
  131.     }  
  132.  
  133.     /**   
  134.     * show 消費(fèi)進(jìn)程.  
  135.     */   
  136.     public void run(){  
  137.         for(int i = 0;i < 20;i++){  
  138.             Mantou m = ss.pop();  
  139. //          System.out.println("消費(fèi)了:---------" + m + " 共" + ss.index + "個(gè)饅頭");  
  140. //  同上  在上面一行進(jìn)行測試也是不妥的,對index的訪問應(yīng)該在原子操作里,因?yàn)榭赡茉趐op之后此輸出之前又生產(chǎn)了,會產(chǎn)生輸出混亂  
  141.             try{  
  142.                 Thread.sleep((int)(Math.random()*1000));  
  143.             }catch(InterruptedException e){  
  144.                 e.printStackTrace();  
  145.             }  
  146.         }  
  147.     }  

 原文鏈接:http://blog.csdn.net/shijinupc/article/details/7250407

【編輯推薦】

  1. 深入理解Java對象序列化
  2. 菜鳥入門Java語言學(xué)習(xí)的要點(diǎn)
  3. 如何優(yōu)化Java程序設(shè)計(jì)和編碼提高性能
  4. Java自定義范型的應(yīng)用技巧
  5. 深入注解:在Java中設(shè)計(jì)和使用自己的注解
責(zé)任編輯:林師授 來源: shijinupc的博客
相關(guān)推薦

2017-05-16 12:30:21

Python多線程生產(chǎn)者消費(fèi)者模式

2015-08-26 09:39:30

java消費(fèi)者

2009-08-13 13:14:31

C#生產(chǎn)者和消費(fèi)者

2021-12-22 11:00:05

模型Golang語言

2020-09-14 08:45:58

多線程模型面試

2024-08-27 10:19:31

2024-03-14 11:58:43

2024-10-11 09:27:52

2021-08-31 10:26:24

存儲

2021-04-20 08:32:51

消息MQ隊(duì)列

2021-12-28 12:01:59

Kafka 消費(fèi)者機(jī)制

2023-06-01 08:08:38

kafka消費(fèi)者分區(qū)策略

2015-08-05 09:33:21

Javawaitnotify

2015-06-15 11:29:34

數(shù)據(jù)中心綠色數(shù)據(jù)中心

2022-07-07 09:00:49

RocketMQ消費(fèi)者消息消費(fèi)

2011-07-22 16:25:38

CA TechnoloIT消費(fèi)化

2011-08-05 16:21:24

2010-03-15 19:21:37

Java多線程

2024-07-15 08:20:24

2011-11-15 10:05:29

Kindle Fire平板市場
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號