posts - 28,  comments - 15,  trackbacks - 0
              java在1.2版本引入wait-and-notify機制,用于線程間通信,它能夠讓某個線程與其他線程在特定條件符合時進行通信;而條件變量是在1.5版本中concurrency包中提供的,條件變量是一種有其多其他多線程系統所提供的同步類型,它與java的wai-and-notify機制非常類似,下面我們通過實例的方式來探討他們之間的區別。
               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();    
          //通過結果觀察,sun JVM(hotspot)的通知機制極有可能是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 閱讀(782) 評論(0)  編輯  收藏 所屬分類: java 并發
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(1)

          隨筆分類(17)

          隨筆檔案(28)

          文章分類(30)

          文章檔案(30)

          相冊

          收藏夾(2)

          hibernate

          java基礎

          mysql

          xml

          關注

          壓力測試

          算法

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 96565
          • 排名 - 601

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 交城县| 太仆寺旗| 五莲县| 衡山县| 泸水县| 东乡| 青龙| 安龙县| 铁力市| 静海县| 新河县| 栾川县| 丽江市| 富蕴县| 太原市| 武宣县| 阿勒泰市| 克什克腾旗| 东源县| 嘉禾县| 岳阳市| 莒南县| 吉水县| 辽中县| 韶山市| 登封市| 石楼县| 乌什县| 弥渡县| 衡阳市| 石河子市| 吉首市| 泊头市| 钟山县| 合作市| 武陟县| 从江县| 镇安县| 新建县| 连城县| 揭东县|