隨筆-348  評論-598  文章-0  trackbacks-0

          之前我們已經用常用方法寫了一個消費者與生產者程序,不過看上去有點煩。在JDK 5里面,Java為我們提供了一個可以簡化這方面開發的的接口

          java.util.concurrent.BlockingQueue
          使用BlockingQueue,我們的程序可以這樣寫
          import java.util.concurrent.BlockingQueue;

          public class ConsumerBlockingQueue extends Thread {

              
          private final BlockingQueue<Integer> queue;
              
          private final String name;
              
              
          public ConsumerBlockingQueue(BlockingQueue<Integer> q, String name)
              
          {
                  queue
          =q;
                  
          this.name=name;
              }

              
          public void run() {
                  
          // TODO Auto-generated method stub
                  try
                  
          {
                      
          while(true)
                      
          {
                          consume(queue.take());
                          
          try
                          
          {
                              sleep(
          800);// 將消費者的睡眠時間設置得比生產者小是為了演示當產品列表為空的情形
                          }
          catch(Exception e){
                              e.printStackTrace();
                          }

                      }

                  }
          catch(Exception e){
                      e.printStackTrace();
                  }

              }

              
              
          private void consume(int i)
              
          {
                  System.out.println(name
          +" consume "+i);
              }


          }

          這個是消費者類。
          public class ProducerBlockingQueue extends Thread{
              
              
          private final BlockingQueue<Integer> queue;
              
          private final String name;
              
          private static int i=0;
              
          public ProducerBlockingQueue(BlockingQueue<Integer> q, String name)
              
          {
                  queue
          =q;
                  
          this.name=name;
              }

              
              
          public void run() {
                  
          // TODO Auto-generated method stub
                  try
                  
          {
                      
          while(true)
                      
          {
                          queue.add(produce());
                          
          try
                          
          {
                              sleep(
          1000);
                          }
          catch(Exception e){
                              e.printStackTrace();
                          }

                      }

                          
                  }
          catch(Exception e){
                      e.printStackTrace();
                  }


              }

              
              
          private int produce()
              
          {
                  System.out.println(name
          +" producing "+i);
                  
          return i++;
              }


          }

          這個是生產者類。
          import java.util.*;
          import java.util.Collection;
          import java.util.Iterator;
          import java.util.concurrent.BlockingQueue;
          import java.util.concurrent.TimeUnit;

          public class Queue implements BlockingQueue {

              
          private List list=new ArrayList();
              
          public boolean add(Object o) {
                  
          // TODO Auto-generated method stub
                  list.add(o);
                  
          return true;
              }


              
          public Object take() throws InterruptedException {
                  
          // TODO Auto-generated method stub
                  while(isEmpty()){}
                  
          return list.remove(0);
              }



              
          public boolean isEmpty() {
                  
          // TODO Auto-generated method stub
                  return list.isEmpty();
              }

          // 當然這個類還有其他的方法需要實現,為了清楚起見,我把使用默認實現的方法都去掉了。

          }

          我們定義一個Queue來實現BlockingQueue。下面我們來測試下
          import java.util.concurrent.BlockingQueue;


          public class Test {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args) {
                  
          // TODO Auto-generated method stub
                  BlockingQueue<Integer> q=new Queue();
                  ProducerBlockingQueue p
          =new ProducerBlockingQueue(q,"p");
                  ProducerBlockingQueue p1
          =new ProducerBlockingQueue(q,"p1");
                  ConsumerBlockingQueue c
          =new ConsumerBlockingQueue(q,"c");
                  ConsumerBlockingQueue c1
          =new ConsumerBlockingQueue(q,"c1");
                  p.start();
                  p1.start();
                  c.start();
                  c1.start();
              }


          }

          看到沒有,就這么簡單,以很少的邏輯代碼實現了消費者與生產者功能,當然你還可以對他進行擴充,讓他更加完善。


          ---------------------------------------------------------
          專注移動開發

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2007-04-28 12:11 TiGERTiAN 閱讀(2412) 評論(4)  編輯  收藏 所屬分類: Java

          評論:
          # re: 使用BlockingQueue來簡化消費者與生產者的問題 2007-04-28 14:18 | 王凌華
          Java文檔里面也有個類似的玩意,

          -----------------------------------------------------------------
          class Producer implements Runnable {
          private final BlockingQueue queue;
          Producer(BlockingQueue q) { queue = q; }
          public void run() {
          try {
          while (true) { queue.put(produce()); }
          } catch (InterruptedException ex) { ... handle ...}
          }
          Object produce() { ... }
          }

          class Consumer implements Runnable {
          private final BlockingQueue queue;
          Consumer(BlockingQueue q) { queue = q; }
          public void run() {
          try {
          while (true) { consume(queue.take()); }
          } catch (InterruptedException ex) { ... handle ...}
          }
          void consume(Object x) { ... }
          }

          class Setup {
          void main() {
          BlockingQueue q = new SomeQueueImplementation();
          Producer p = new Producer(q);
          Consumer c1 = new Consumer(q);
          Consumer c2 = new Consumer(q);
          new Thread(p).start();
          new Thread(c1).start();
          new Thread(c2).start();
          }
          }

          你不是抄襲的吧。:)   回復  更多評論
            
          # re: 使用BlockingQueue來簡化消費者與生產者的問題 2007-04-28 14:28 | TiGERTiAN
          哈哈。。抄襲抄襲。文檔上面的不詳細,寫個能運行得出來。。當作學習。。  回復  更多評論
            
          # re: 使用BlockingQueue來簡化消費者與生產者的問題 2008-12-01 15:47 | qw
          public Object take() throws InterruptedException {
          // TODO Auto-generated method stub
          while(isEmpty()){}
          return list.remove(0);
          }

          while(isEmpty()){},這個代碼你也敢寫?  回復  更多評論
            
          # re: 使用BlockingQueue來簡化消費者與生產者的問題 2008-12-01 15:58 | TiGERTiAN
          @qw
          怎么了?是一個無限循環,主要是有一個生產線程在那里,我才這樣寫的,如果是實際開發當然要做相應處理,不能這樣寫了。  回復  更多評論
            
          主站蜘蛛池模板: 大余县| 黎平县| 皋兰县| 枣强县| 陆河县| 邯郸县| 通化县| 沈阳市| 泰兴市| 页游| 冀州市| 拜城县| 黄龙县| 天峨县| 佳木斯市| 龙口市| 柞水县| 潍坊市| 克东县| 融水| 理塘县| 肇东市| 神木县| 辽中县| 通山县| 清原| 兴国县| 电白县| 彰化市| 宝应县| 南阳市| 织金县| 时尚| 乌鲁木齐县| 栾城县| 五大连池市| 芜湖县| 瓦房店市| 沧州市| 西贡区| 连山|