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

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

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

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    線程--條件Condition

    Posted on 2009-12-23 22:50 啥都寫點 閱讀(440) 評論(0)  編輯  收藏 所屬分類: J2SE
        本例介紹一個籃子程序,為了簡化問題,籃子中最多只能有一個蘋果。消費者必須在籃子里有蘋果的時候才能吃蘋果,否則它必須暫時放棄對籃子的鎖定,等到生產者往籃子里放了蘋果后再去拿來吃。而生產者也必須等到籃子空了才能往里放蘋果,否則它也需要暫時解鎖等消費者把蘋果吃了才能往籃子里放蘋果。
     
         通過Lock的newCondition方法創建Condition對象。
         Condition的await方法使當前線程進入等待狀態,并且釋放它占據的Lock,直到有其他線程喚醒當前線程時,重新占有Lock。
         Condition的signal方法喚醒其他正在等待該Condition的線程。


    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;

    /**
     * 有時候線程取得lock后需要在一定條件下才能做某些工作,比如說經典的Producer和Consumer問題。
     * 在Java 5.0以前,這種功能是由Object類的wait(), notify()和notifyAll()等方法實現的,
     * 在5.0里面,這些功能集中到了Condition這個接口來實現。
     
    */

    public class ConditionTest {

        
    /**
         * 籃子程序,這里為了簡化問題,籃子中最多只能有一個蘋果。
         * Consumer必須在籃子里有蘋果的時候才能吃蘋果,否則它必須暫時放棄對籃子的鎖定,
         * 等到Producer往籃子里放了蘋果后再去拿來吃。而Producer必須等到籃子空了才能往里放蘋果,
         * 否則它也需要暫時解鎖等Consumer把蘋果吃了才能往籃子里放蘋果。
         
    */

        
    public static class Basket {
            
    // 鎖
            Lock lock = new ReentrantLock();
            
    //    根據鎖產生Condition對象
            Condition produced = lock.newCondition();
            Condition consumed 
    = lock.newCondition();
            
    // 籃子中的蘋果數,最多為1
            int num = 0;

            
    /**
             * 生產蘋果,往籃子里放
             * 
    @throws InterruptedException
             
    */

            
    public void produce() throws InterruptedException {
                
    // 獲得鎖
                lock.lock();
                System.out.println(
    "Producer get a lock");
                
    try {
                    
    // 判斷是否滿足生產條件
                    while (num == 1{
                        
    // 如果有蘋果,則不生產,放棄鎖,進入睡眠
                        
    // 等待消費者消費
                        System.out.println("Producer sleep");
                        consumed.await(); 
                        System.out.println(
    "Producer awaked");
                    }

                    
    /*生產蘋果*/
                    Thread.sleep(
    500);
                    System.out.println(
    "Producer produced an Apple.");
                    num 
    = 1;
                    
    // 通知等待produced Condition的線程
                    produced.signal();
                }
     finally {
                    lock.unlock();
                }

            }

            
    /**
             * 消費蘋果,從籃子中取
             * 
    @throws InterruptedException
             
    */

            
    public void consume() throws InterruptedException {
                
    // 獲得鎖
                lock.lock();
                System.out.println(
    "Consumer get a lock");
                
    try {
                    
    // 判斷是否滿足消費條件
                    while (num == 0{
                        
    // 如果沒有蘋果,無法消費,則放棄鎖,進入睡眠
                        
    // 等待生產者生產蘋果
                        System.out.println("Consumer sleep");
                        produced.await();  
                        System.out.println(
    "Consumer awaked");
                    }

                    
    /*吃蘋果*/
                    Thread.sleep(
    500);
                    System.out.println(
    "Consumer consumed an Apple.");
                    num 
    = 0;
                    
    // 發信號喚醒某個等待consumed Condition的線程
                    consumed.signal();
                }
     finally {
                    lock.unlock();
                }

            }

        }

        
    /**
         * 測試Basket程序
         
    */

        
    public static void testBasket() throws Exception {
            
    final Basket basket = new Basket();
            
    //    定義一個producer
            Runnable producer = new Runnable() {
                
    public void run() {
                    
    try {
                        basket.produce();
                    }
     catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }

                }

            }
    ;

            
    // 定義一個consumer
            Runnable consumer = new Runnable() {
                
    public void run() {
                    
    try {
                        basket.consume();
                    }
     catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }

                }

            }
    ;

            
    //    各產生3個consumer和producer
            ExecutorService service = Executors.newCachedThreadPool();
            
    for (int i = 0; i < 3; i++){
                service.submit(producer);
            }

            
    for (int i = 0; i < 3; i++){
                service.submit(consumer);
            }

            service.shutdown();
        }
          

        
    public static void main(String[] args) throws Exception {
            ConditionTest.testBasket();
        }

    }


                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 亚洲理论电影在线观看| 可以免费观看的一级毛片| 亚洲一区二区三区AV无码| 国产成人亚洲精品无码AV大片| 一个人免费观看视频www| 久久水蜜桃亚洲av无码精品麻豆| 叮咚影视在线观看免费完整版| 久久久久亚洲AV成人网人人软件 | 在免费jizzjizz在线播| 亚洲综合视频在线| 99视频免费观看| 亚洲免费网站在线观看| 99久久这里只精品国产免费| 一本色道久久88亚洲精品综合| 一个人免费观看在线视频www| 亚洲精品无码久久久久YW| 国产一区二区免费在线| 人人鲁免费播放视频人人香蕉| 亚洲日韩中文在线精品第一 | 国产成人精品久久亚洲高清不卡 | 亚洲熟妇无码AV| 性做久久久久免费看| 人碰人碰人成人免费视频| 亚洲国产另类久久久精品小说 | 亚洲av无码成人黄网站在线观看| 无码一区二区三区免费| 77777午夜亚洲| 国产成人免费ā片在线观看| 九九热久久免费视频| 久久亚洲国产成人精品性色| 成人特黄a级毛片免费视频| 羞羞网站免费观看| 亚洲AV无码久久寂寞少妇| 免费福利网站在线观看| 日韩在线视频免费| 久久亚洲中文字幕精品有坂深雪 | 亚洲日本国产精华液| 日韩视频免费一区二区三区| 9久热精品免费观看视频| 亚洲熟妇av一区| 亚洲av再在线观看|