欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

阻塞队列BlockingQueue使用示例,队列blockingqueue,阻塞队列Blocking

来源: javaer 分享于  点击 37160 次 点评:281

阻塞队列BlockingQueue使用示例,队列blockingqueue,阻塞队列Blocking


阻塞队列BlockingQueue使用示例

ProducerConsumerTest2.java

package cn.itcast.gz;import java.util.Random;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 多个生产者、消费者问题与线程间的通信(用阻塞队列实现) * @author long * */public class ProducerConsumerTest2 {    public static void main(String[] args) {        final BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(3);        ExecutorService service = Executors.newFixedThreadPool(10);        for(int i = 0;i<4;i++)        {            service.execute(new ProducerAndConsumer(blockingQueue));        }    }}class ProducerAndConsumer implements Runnable{      private boolean flag = false;    private Integer j = 1;    private Lock lock = new ReentrantLock();     Condition pro_con = lock.newCondition();    Condition con_con = lock.newCondition();    private BlockingQueue<Integer> blockingQueue;    public ProducerAndConsumer(BlockingQueue<Integer> blockingQueue)    {        this.blockingQueue= blockingQueue;    }    //生产    public void put()    {        try {            lock.lock();            while(flag)            pro_con.await();            System.out.println("正在准备放入数据。。。");            Thread.sleep(new Random().nextInt(10)*100);            Integer value = new Random().nextInt(30);            blockingQueue.put(value);            System.out.println(Thread.currentThread().getName()+"   放入的数据    "+value);            flag = true;            con_con.signal();        } catch (Exception e) {            e.printStackTrace();        }        finally        {            lock.unlock();        }    }    public void get()    {         try {             lock.lock();            while(!flag)                con_con.await();            System.out.println("正在准备取数据。。。");            Thread.sleep(new Random().nextInt(10)*1000);            System.out.println(Thread.currentThread().getName()+"   取到的数据为"+blockingQueue.take());                 flag = false;                 pro_con.signal();        } catch (Exception e) {            e.printStackTrace();        }         finally         {             lock.unlock();         }    }    @Override    public void run() {        while(true)        {            if(j==1)            {                put();            }            else            {                get();            }            j=(j+1)%2;        }    }}
相关栏目:

用户点评