<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    無為

    無為則可為,無為則至深!

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks
    問題描述:一個倉庫可以存放N件物品。生產者每生產一件產品,將產品放入倉庫,倉庫滿了就停止生產。消費者每次從倉庫中去一件物品,然后進行消費,倉庫空時就停止消費。

    ???解答:在J2SE1.5中的java.util.concurrent?新功能包提供一些實用的通用類供并行程序使用。其中的BlockingQueue接口及其實現類對于解決[生產者-消費者問題]非常方便。下面是實現的代碼(例子摘抄自jdk1.5幫助文檔,稍做修改):

    import?java.util.concurrent.ArrayBlockingQueue;
    import?java.util.concurrent.BlockingQueue;

    /**
    ?*?@author?Rebirth
    ?*/
    class?Consumer?implements?Runnable?{
    ?private?int?i=0;
    ?private?String?sName="";
    ?private?final?BlockingQueue?queue;
    ?Consumer(BlockingQueue?q,String?sName)?{?queue?=?q;this.sName=sName;?}
    ?/*?
    ??*?@see?java.lang.Runnable#run()
    ??*/
    ?public?void?run()?{
    ??while(i<5)?{?
    ???try{
    ????//消費產品
    ????consume(queue.take());??????????
    ?????????}
    ???catch?(InterruptedException?ex)?{
    ????System.out.println(ex.getMessage());
    ???}
    ???finally{i++;}
    ??}
    ?}
    ?private?void?consume(Object?product){
    ??System.out.println(sName?+?"?consume?"?+?product.toString());
    ?}
    }
    class?Producer?implements?Runnable?{
    ?private?int?i=0;
    ?private?String?sName="";?
    ?private?int?iNum=0;
    ?private?final?BlockingQueue?queue;
    ?Producer(BlockingQueue?q,String?sName)?{?queue?=?q;this.sName=sName;?}
    ?/*?(non-Javadoc)
    ??*?@see?java.lang.Runnable#run()
    ??*/
    ?public?void?run()?{
    ??while(i<10)?{?
    ???try{
    ????//生產產品
    ????queue.put(produce());?????????????
    ??????}catch?(InterruptedException?ex)?{
    ????System.out.println(ex.getMessage());
    ??????}finally{i++;}
    ??}??????
    ?}
    ?private?Object?produce(){
    ??String?sProduct?="p"?+?(++iNum);
    ??System.out.println(sName?+?"?product?"?+?sProduct);??
    ??return?sProduct;
    ?}
    }
    public?class?Factory?{
    ??public?static?void?main(String[]?args)?{
    ??????BlockingQueue?q?=?new?ArrayBlockingQueue(10);
    ??????Producer?p?=?new?Producer(q,"?p1?");
    ??????Consumer?c1?=?new?Consumer(q,"?c1?");
    ??????Consumer?c2?=?new?Consumer(q,"?c2?");
    ??????new?Thread(p).start();
    ??????new?Thread(c1).start();
    ??????new?Thread(c2).start();??????
    ????}
    }

    ???????BlockingQueue是線程安全的,當倉庫中已經沒有物品而消費者繼續往里面取時隊列自動進行阻塞。需要注意的是,BlockingQueue是不接受null值的,但嘗試將一個null值插入隊列,會拋出NullPointerException?例外。


    凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
    、轉載請注明來處和原文作者。非常感謝。

    posted on 2006-06-11 12:56 草兒 閱讀(268) 評論(0)  編輯  收藏 所屬分類: Java編程經驗談
    主站蜘蛛池模板: 亚洲精品人成无码中文毛片| 国产裸模视频免费区无码| 亚洲中文字幕无码中文字在线| 国产在亚洲线视频观看| 俄罗斯极品美女毛片免费播放| 亚洲av中文无码乱人伦在线观看| 成人免费无码大片A毛片抽搐色欲| 亚洲AV成人一区二区三区在线看| 四虎免费在线观看| 亚洲国产成人AV网站| 亚洲国产激情一区二区三区| 九九免费精品视频在这里| 亚洲最大激情中文字幕| 久久久精品免费国产四虎| 亚洲高清免费在线观看| 成年人网站在线免费观看| 无码一区二区三区亚洲人妻| 亚洲欧洲日产国码一级毛片| 国产在线观看无码免费视频| 亚洲资源在线观看| 中文字幕无码免费久久99| 亚洲aⅴ无码专区在线观看春色| 国产精品成人无码免费| 水蜜桃视频在线观看免费播放高清| 无码乱人伦一区二区亚洲一| 免费福利网站在线观看| 免费无遮挡无码视频在线观看| 亚洲熟妇无码AV在线播放| 在线免费中文字幕| 亚洲AV无码成人精品区日韩| 亚洲熟妇无码乱子AV电影| 精品国产污污免费网站aⅴ| 国产精品手机在线亚洲| 亚洲AV永久无码精品| 免费看的一级毛片| 青青操免费在线观看| 亚洲中文无码卡通动漫野外| 亚洲熟妇av一区二区三区漫画| 97视频免费在线| a级毛片免费观看在线| 亚洲人成免费电影|