条件拥塞队列原理学习

条件阻塞队列原理学习

 

package com.thread.test6;


import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;


/**

 * @fileName 条件阻塞队列原理

 * @description 条件阻塞队列原理学习

 * @date 2012-6-17

 * @time 21:01

 * @author wst

 *

 */

public class BlockingQueue {

public static void main(String[] args) {

final BlockingQueue bq=new BlockingQueue();

for(int i=1;i<=50;i++){

final int data=i;

new Thread(new Runnable(){

@Override

public void run() {

try {

System.out.println("线程"+data+"存入的数据:"+"data"+data);

bq.put("data"+data);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}).start();

}

for(int i=1;i<=50;i++){

final int data=i;

new Thread(new Runnable(){

@Override

public void run() {

try {

System.out.println("线程"+data+"取出的数据:"+bq.take());

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}).start();

}

}

final Lock lock=new ReentrantLock();

final Condition notFull=lock.newCondition();

final Condition notEmpty=lock.newCondition();

final Object[] items=new Object[100];

int putptr,takeptr,count;

/**

* 向队列存放数据,从第一个开始存,直到存完

* @param obj

* @throws InterruptedException 

*/

public void put(Object obj) throws InterruptedException{

lock.lock();

try{

while(count==items.length){//存放数据已满

notFull.await();//等待

}

items[putptr]=obj;//给存入的对象分配位置

if(++putptr==items.length){//存放的数据到最后一个位置了,则下次从第一个位置开始存放

putptr=0;

}

++count;//存放数量增加

notEmpty.signal();//通知取数据方法,可以取数据了

}finally{

lock.unlock();

}

}

/**

* 取数据,从第一个开始取,直到取完

* @return 一个对象

* @throws InterruptedException

*/

public Object take() throws InterruptedException{

lock.lock();

try{

while(count==0){

notEmpty.await();//没有数据了,则等待

}

Object obj=items[takeptr];

if(++takeptr==items.length){

takeptr=0;

}

--count;

notFull.signal();//每取走一个数据就告诉存数据方法,可以存放数据了

return obj;

}finally{

lock.unlock();

}

}

}