第七部分 阻塞队列

阻塞队列

在应用开发领域,生产者——消费者模式代表了一种异步的通信模式,基于这种模式发展出来的消息传递机制更上一种应用架构模式。基于消息传递机制的应用系统,既可能是传统的Clinet/Servier架构,也可能打破这种格局,而形成P2P架构。

 队列(Queue)因为其"先进先出(FIFO)"的特点,成为经常应用于生产者-消费者模式的数据结构。在Java中java.uril.Queue接口定义的便是队列这一数据结构,而并发工具包中的java.util.concurrent.BlockingQueue接口定义了一种阻塞性,线程安全的队列。java.util.concurrent.LinkedBlockingQueue是其实现类。BlockingQueue队列的开发人员,将自动享有以下的便利。

将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点。

从队列头部取一个对象,如果没有对象,就等待直到有可取的对象。

在存取队列的过程中,锁定队列对象,不允许其他线程访问队列。

BlockingQueue定义的主要方法如下:

 void put(Object object):将object对象放在队列尾部。如果有必要,将等待可用的空间。

Object take();从队列头部取出一个对象并返回该对象。

前面已经基于并发工具包连续开发了几个线程池,有人可能就会产生错觉:并发工具包中的工具类只能运行在线程池中。为了推翻这一错觉,下面用于演示BlockingQueue队列的例程TestBlockingWithThread将不使用线程池,而是显式地创建一个写入队列的线程,两个读取队列的线程。

代码如下【TestBlockingQueueWithThread

/** * TestBlockingQueueWithThread.java * 版权所有(C) 2011 [email protected] * 创建:崔冉 2011-1-14 下午02:50:43 */ package com.cayden.thread833; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; /** * @author 崔冉 * @version 1.0.0 * @desc */ public class TestBlockingQueueWithThread { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //创建容纳10个整数的队列。 final BlockingQueue<Integer> queue=new LinkedBlockingDeque<Integer>(10); //队列末尾的标志 final Integer endInt=new Integer(-0); //写队列的线程。 Runnable setter=new Runnable() { public void run(){ try{ for(int i=1;i<10;i++){ queue.put(new Integer(i)); System.out.println(Thread.currentThread().getName()+": 向队列写入数字"+i); } queue.put(new Integer(0)); }catch (InterruptedException e) { // TODO: handle exception } } }; new Thread(setter).start(); //两个读队列的线程 for(int i=0;i<2;i++){ Runnable getter=new Runnable() { public void run(){ while(true){ try{ Thread.sleep(500); Integer num=queue.take(); if(num.intValue()==0){ queue.put(new Integer(0)); break; } System.out.println(Thread.currentThread().getName()+": 向队列读出数字"+num.intValue()); }catch (InterruptedException e) { // TODO: handle exception } } } }; new Thread(getter).start(); } } }

运行结果:

Thread-0: 向队列写入数字1 Thread-0: 向队列写入数字2 Thread-0: 向队列写入数字3 Thread-0: 向队列写入数字4 Thread-0: 向队列写入数字5 Thread-0: 向队列写入数字6 Thread-0: 向队列写入数字7 Thread-0: 向队列写入数字8 Thread-0: 向队列写入数字9 Thread-2: 向队列读出数字1 Thread-1: 向队列读出数字2 Thread-2: 向队列读出数字4 Thread-1: 向队列读出数字3 Thread-2: 向队列读出数字5 Thread-1: 向队列读出数字6 Thread-2: 向队列读出数字8 Thread-1: 向队列读出数字7 Thread-1: 向队列读出数字9

你可能感兴趣的:(thread,数据结构,exception,Integer,getter,setter)