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 阅读(765) 评论(0)  编辑  收藏 所属分类: java 并发

只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(1)

随笔分类(17)

随笔档案(28)

文章分类(30)

文章档案(30)

相册

收藏夹(2)

hibernate

java基础

mysql

xml

关注

压力测试

算法

最新随笔

搜索

  •  

积分与排名

  • 积分 - 95541
  • 排名 - 602

最新评论

阅读排行榜

评论排行榜