posts - 28,  comments - 15,  trackbacks - 0
              java在1.2版本引入wait-and-notify機(jī)制,用于線程間通信,它能夠讓某個線程與其他線程在特定條件符合時進(jìn)行通信;而條件變量是在1.5版本中concurrency包中提供的,條件變量是一種有其多其他多線程系統(tǒng)所提供的同步類型,它與java的wai-and-notify機(jī)制非常類似,下面我們通過實例的方式來探討他們之間的區(qū)別。
               wai-and-notify示例代碼:
          package com.zxl.thread.notify;
          /**
           * 
           * 
          @author zhangxl
           *
           
          */

          public class SynThread1 extends Thread {
              
              
          private Object lockObj;
              
          private volatile int i = 0;
              
          public SynThread1(Object lockObj){
                  
          this.lockObj = lockObj;
              }


              
          public void run(){
                  
                  
          synchronized(lockObj){
                      
          while(true){
                          
          if(i==0){
                              
          try {
                                  System.out.println(Thread.currentThread().getName()
          +" will be waiting.");
                                  lockObj.wait();
                              }
           catch (InterruptedException e) {
                                  
          // TODO Auto-generated catch block
                                  e.printStackTrace();
                              }

                          }

                          
                          System.out.println(Thread.currentThread().getName()
          +": i="+i);
                          
          //i++;
                          
                          
          if(i>=1return;
                      }

                  }

              }

              
              
          public static void  main(String[] arg){
                  
                  Object lock 
          = new Object();
                  
                  SynThread1 t1 
          = new SynThread1(lock);
                  t1.setName(
          "SynThread_1");
                  SynThread1 t2 
          = new SynThread1(lock);
                  t2.setName(
          "SynThread_2");
                  t2.start();
                  t1.start();
                  
                  
                  
                  
          try {
                      Thread.sleep(
          1000);
                      
                      
          synchronized(lock){
                          lock.notify();    
          //通過結(jié)果觀察,sun JVM(hotspot)的通知機(jī)制極有可能是FIFO的策略,原因是t1、t2只要誰先啟動,誰就將被喚醒。
                      }

                  }
           catch (InterruptedException e) {
                      
          // TODO Aut o-generated catch block            e.printStackTrace();
                  }

              }

          }



          條件變量示例:

          package com.zxl.thread.notify;

          import java.util.concurrent.locks.Condition;
          import java.util.concurrent.locks.ReentrantLock;

          public class ConditionThread implements Runnable {
           
           
           
           private ReentrantLock lock;
           
           private Condition c;
           
           private volatile int i=0;
           
           public ConditionThread(ReentrantLock lock){
            this.lock = lock;
            c = lock.newCondition();
           }

           public void run() {
            
            lock.lock();
            
            try{
             
             while(true){
              if(i==0){
               System.out.println(Thread.currentThread().getName()+" will be waiting...");
               c.await();
              }
              
              System.out.println(Thread.currentThread().getName()+" is already waked up,i="+i);
              
              if(i>=1) return;
             }
             
            } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
            finally{
             lock.unlock();
            }
            
            
            
           }
           
           public Condition getCondition(){
            return c;
           }
           
           public static void main(String[] args){
            
            
            
            ReentrantLock lock = new ReentrantLock();
            ConditionThread ct1 = new ConditionThread(lock);
            ConditionThread ct2 = new ConditionThread(lock);
            Thread t1 = new Thread(ct1);
            t1.setName("C_Thread_1");
            Thread t2 = new Thread(ct2);
            t2.setName("C_Thread_2");
            
            t1.start();
            t2.start();
            
            try {
             Thread.sleep(1000);
            } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }
            
            lock.lock();
            ct1.getCondition().signal();   //喚醒第一個線程
            lock.unlock();
           }

          }









          posted on 2011-07-28 12:11 zhangxl 閱讀(781) 評論(0)  編輯  收藏 所屬分類: java 并發(fā)
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類(17)

          隨筆檔案(28)

          文章分類(30)

          文章檔案(30)

          相冊

          收藏夾(2)

          hibernate

          java基礎(chǔ)

          mysql

          xml

          關(guān)注

          壓力測試

          算法

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 96364
          • 排名 - 601

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宁德市| 顺义区| 舟山市| 正阳县| 文山县| 和田县| 庆云县| 南陵县| 泰安市| 米脂县| 弥勒县| 张家川| 玉门市| 旅游| 临夏市| 舟曲县| 安徽省| 吐鲁番市| 东明县| 通道| 阜阳市| 凤冈县| 巩义市| 隆德县| 嫩江县| 泾川县| 大港区| 林州市| 裕民县| 屏东市| 平乡县| 陈巴尔虎旗| 锡林浩特市| 长丰县| 绩溪县| 鄂伦春自治旗| 绥江县| 新源县| 资阳市| 绿春县| 宜春市|