一磕一碰

          js/java

          統(tǒng)計

          留言簿

          閱讀排行榜

          評論排行榜

          2012年12月4日 #

          通過wait和notify實現(xiàn)的生產(chǎn)者消費者demo

          Java代碼  :
          import java.util.ArrayList;  
          import java.util.List;  
          /** 
           * 通過wait和notify實現(xiàn)的生產(chǎn)者消費者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)者與多消費者  
                  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)-->線程--" + (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(), "消費線程--" + (i+1));  
                      cs[i].start();  
                  }  
            
                  // 等待生產(chǎn)線程結(jié)束并中斷消費線程  
                  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)前線程的執(zhí)行權(quá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 @ 2012-12-04 10:06 一磕一碰 閱讀(191) | 評論 (0)編輯 收藏

          僅列出標(biāo)題  
          主站蜘蛛池模板: 河东区| 雅安市| 宁都县| 湖北省| 闽清县| 宜阳县| 甘洛县| 枣强县| 韩城市| 苏尼特右旗| 体育| 湘乡市| 依安县| 保山市| 临海市| 耒阳市| 钟祥市| 固安县| 祁东县| 钟山县| 平利县| 张家口市| 安岳县| 综艺| 博湖县| 双流县| 井冈山市| 嘉定区| 辽阳市| 民勤县| 正安县| 社会| 乳山市| 太谷县| 赤峰市| 息烽县| 永寿县| 万州区| 军事| 大余县| 丹寨县|