一磕一碰

          js/java

          統(tǒng)計(jì)

          留言簿

          閱讀排行榜

          評(píng)論排行榜

          通過(guò)wait和notify實(shí)現(xiàn)的生產(chǎn)者消費(fèi)者demo

          Java代碼  :
          import java.util.ArrayList;  
          import java.util.List;  
          /** 
           * 通過(guò)wait和notify實(shí)現(xiàn)的生產(chǎn)者消費(fèi)者demo 
           * User: zhangb 
           * Date: 12-12-1 
           * Time: 下午7:19 
           */  
          public class ProducerAndCustomerDemo {  
              private static int capacity = 150;  
              private static List<String> basket = new ArrayList<String>(capacity);  
            
              public static void main(String[] args) {  
                  // 多生產(chǎn)者與多消費(fèi)者  
                  int producerSize = 2;  
                  Thread[] ps = new Thread[producerSize];  
                  for (int i = 0, step = 500; i < producerSize; i ++) {  
                      ps[i] = new Thread(new Producer((i) * step, (i+1) * step), "生產(chǎn)-->線(xiàn)程--" + (i+1));  
                      ps[i].start();  
                  }  
            
                  int customerSize = 10;  
                  Thread[] cs = new Thread[customerSize];  
                  for (int i = 0; i < customerSize; i ++) {  
                      cs[i] = new Thread(new Customer(), "消費(fèi)線(xiàn)程--" + (i+1));  
                      cs[i].start();  
                  }  
            
                  // 等待生產(chǎn)線(xiàn)程結(jié)束并中斷消費(fèi)線(xiàn)程  
                  for (int i = 0; i < producerSize; i ++) {  
                      try {  
                          ps[i].join();  
                      } catch (InterruptedException e) {  
                          e.printStackTrace();  
                      }  
                  }  
                  for (int i = 0; i < customerSize; i ++) {  
                      cs[i].interrupt();  
                  }  
              }  
              static class Producer implements Runnable {  
                  private int start;  
                  private int end;  
            
                  Producer(int start, int end) {  
                      this.start = start;  
                      this.end = end;  
                  }  
            
                  @Override  
                  public void run() {  
                      for (int i = start; i < end; i ++) {  
                          synchronized (basket) {  
                              try {  
                                  while (basket.size() == capacity) {  
                                      basket.wait();  
                                  }  
                                  String p = " PRO" + i;  
                                  System.out.println(Thread.currentThread().getName() + p);  
                                  basket.add(p);  
                                  basket.notifyAll();  
                                  Thread.yield(); // 讓出當(dāng)前線(xiàn)程的執(zhí)行權(quán),有利于看出交替線(xiàn)程運(yùn)行的效果  
                              } catch (InterruptedException e) {  
                                  e.printStackTrace();  
                                  break;  
                              }  
                          }  
                      }  
                  }  
              }  
              static class Customer implements Runnable {  
                  @Override  
                  public void run() {  
                      while (true) {  
                          synchronized (basket) {  
                              try{  
                                  while (basket.size() == 0) {  
                                      basket.wait();  
                                  }  
                                  System.out.println(Thread.currentThread().getName() + basket.remove(0));  
                                  basket.notifyAll();  
                              } catch (InterruptedException e) {  
                                  System.out.println(Thread.currentThread().getName() + "退出");  
                                  break;  
                              }  
                          }  
                      }  
                  }  
              }  
          }  

          posted on 2012-12-04 10:06 一磕一碰 閱讀(190) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 博客| 合山市| 嘉义市| 乐陵市| 含山县| 临猗县| 合川市| 巴彦淖尔市| 临漳县| 临朐县| 巴青县| 惠水县| 宜兰县| 绥德县| 嘉义市| 宜川县| 廉江市| 大冶市| 大余县| 繁昌县| 富川| 永平县| 灵宝市| 乐昌市| 郑州市| 东港市| 达孜县| 根河市| 甘洛县| 凉城县| 郑州市| 安塞县| 永修县| 高平市| 三明市| 涪陵区| 隆昌县| 临泽县| 渭源县| 遵义市| 略阳县|