<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

    線程--Exchanger

    Posted on 2009-12-24 21:31 啥都寫點 閱讀(238) 評論(0)  編輯  收藏 所屬分類: J2SE
        本例介紹第四個同步裝置:Exchanger,它讓兩個線程呼喚信息。本實例模擬服務生和顧客,服務生往空杯子中倒水,顧客從裝滿水的杯子中喝水,然后互換杯子,服務生接著倒水,顧客接著喝水。

         初始化Exchanger對象時,可以通過泛型指定杯子能交換的信息類型。如“new Exchanger<String>;” 表示只能交換String類型的信息。
         Exchanger的exchanger方法表示當前線程準備交換信息,等待其他線程與它交換信息。當有其他線程調用該Exchanger對象的exchange方法時,立即交換信息。


    import java.util.concurrent.Exchanger;

    /**
     * Exchanger讓兩個線程可以互換信息。
     * 例子中服務生線程往空的杯子里倒水,顧客線程從裝滿水的杯子里喝水,
     * 然后通過Exchanger雙方互換杯子,服務生接著往空杯子里倒水,顧客接著喝水,
     * 然后交換,如此周而復始。
     
    */

    public class ExchangerTest {

        
    // 描述一個裝水的杯子
        public static class Cup{
            
    // 標識杯子是否有水
            private boolean full = false;
            
    public Cup(boolean full){
                
    this.full = full;
            }

            
    // 添水,假設需要5s
            public void addWater(){
                
    if (!this.full){
                    
    try {
                        Thread.sleep(
    5000);
                    }
     catch (InterruptedException e) {
                    }

                    
    this.full = true;
                }

            }

            
    // 喝水,假設需要10s
            public void drinkWater(){
                
    if (this.full){
                    
    try {
                        Thread.sleep(
    10000);
                    }
     catch (InterruptedException e) {
                    }

                    
    this.full = false;
                }

            }

        }

        
        
    public static void testExchanger() {
            
    //    初始化一個Exchanger,并規(guī)定可交換的信息類型是杯子
            final Exchanger<Cup> exchanger = new Exchanger<Cup>();
            
    // 初始化一個空的杯子和裝滿水的杯子
            final Cup initialEmptyCup = new Cup(false); 
            
    final Cup initialFullCup = new Cup(true);

            
    //服務生線程
            class Waiter implements Runnable {
                
    public void run() {
                    Cup currentCup 
    = initialEmptyCup;
                    
    try {
                        
    int i=0;
                        
    while (i < 2){
                            System.out.println(
    "服務生開始往杯子中添水:"
                                    
    + System.currentTimeMillis());
                            
    // 往空的杯子里加水
                            currentCup.addWater();
                            System.out.println(
    "服務生添水完畢:"
                                    
    + System.currentTimeMillis());
                            
    // 杯子滿后和顧客的空杯子交換
                            System.out.println("服務生等待與顧客交換杯子:"
                                    
    + System.currentTimeMillis());
                            currentCup 
    = exchanger.exchange(currentCup);
                            System.out.println(
    "服務生與顧客交換杯子完畢:"
                                    
    + System.currentTimeMillis());
                            i
    ++;
                        }


                    }
     catch (InterruptedException ex) {
                    }

                }

            }


            
    //顧客線程
            class Customer implements Runnable {
                
    public void run() {
                    Cup currentCup 
    = initialFullCup;
                    
    try {
                        
    int i=0;
                        
    while (i < 2){
                            System.out.println(
    "顧客開始喝水:"
                                    
    + System.currentTimeMillis());
                            
    //把杯子里的水喝掉
                            currentCup.drinkWater();
                            System.out.println(
    "顧客喝水完畢:"
                                    
    + System.currentTimeMillis());
                            
    //將空杯子和服務生的滿杯子交換
                            System.out.println("顧客等待與服務生交換杯子:"
                                    
    + System.currentTimeMillis());
                            currentCup 
    = exchanger.exchange(currentCup);
                            System.out.println(
    "顧客與服務生交換杯子完畢:"
                                    
    + System.currentTimeMillis());
                            i
    ++;
                        }

                    }
     catch (InterruptedException ex) {
                    }

                }

            }

            
            
    new Thread(new Waiter()).start();
            
    new Thread(new Customer()).start();
        }

        
        
    public static void main(String[] args) {
            ExchangerTest.testExchanger();
        }

    }



                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 亚洲校园春色小说| 国产一区二区三区亚洲综合| 免费看韩国黄a片在线观看| 亚洲欧美日韩中文高清www777| 亚洲AV无码乱码在线观看性色扶| 久久久久久免费一区二区三区| 亚洲熟妇av午夜无码不卡| 亚洲性日韩精品国产一区二区| 91大神免费观看| 免费中文字幕视频| 亚洲一区二区三区夜色| 国产高清免费在线| 久久青草免费91观看| 国产午夜亚洲精品不卡| 久久综合亚洲色HEZYO社区| 成人亚洲综合天堂| 69免费视频大片| 国产免费伦精品一区二区三区 | 最新亚洲春色Av无码专区| 亚洲А∨精品天堂在线| 久热中文字幕在线精品免费| 亚洲天堂免费在线视频| 亚洲an日韩专区在线| 亚洲日韩乱码中文无码蜜桃臀网站| 成全高清视频免费观看| 日韩免费高清大片在线| 免费大片av手机看片| 亚洲宅男精品一区在线观看| 亚洲精品无码永久中文字幕| 国产又长又粗又爽免费视频| 91频在线观看免费大全| 久久免费视频观看| 在线播放免费人成视频网站| 亚洲另类无码一区二区三区| 亚洲欧洲日产国产综合网| 久久影视综合亚洲| 国产精品国产自线拍免费软件| 免费电影在线观看网站| 一级毛片在线免费看| 中文字幕免费在线看| 国产天堂亚洲国产碰碰|