BlockingQueue阻塞队列

java.util.concurrent包:
1.Excutors类:通过这个类可获得多种线程池的实例

Excutors.newSingleThreadExecutor():获得单线程的ExecutorService;

Excutors.newFixedThreadPool(int nThreads):获得固定大小线程池的ExecutorService;

Excutors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池,返回ExecutorService。

2.ExecutorService接口

submit(Runnable task):提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future;
shutdown():启动一次顺序关闭,执行以前提交的任务,但不接受新任务;
shutdownNow():试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。

3.BlockingQueue接口:阻塞队列

   支持两个附加操作:获取元素时等待队列变为非空,存储元素时等待空间变得可用。具体描述为:
   如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.
   如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.

  (1)BlockingQueue定义的常用方法如下:

add(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容纳,则返回true,否则抛出异常.
offer(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容纳,则返回true,否则返回false.
put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue没有空间,则线程被阻断,等待可用的空间.
poll(time):获取并移除BlockingQueue里排在首位的对象,若不能立即取出,则可以等待time时间,若仍取不到则返回null.
take():获取并移除BlockingQueue里排在首位的对象,若不能立即取出,阻断进入等待状态.

(2)BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类

ArrayBlockingQueue:由数组支持的有界(固定大小)BlockingQueue,其构造函数必须带一个规定大小的int参数.其所含的对象是以FIFO(先入先出)顺序排序的.
LinkedBlockingQueue:无界(大小不定)BlockingQueue,若其构造函数可带可不带规定大小的int参数.其所含的对象是以FIFO(先入先出)顺序排序的.
PriorityBlockingQueue:无界(大小不定)BlockingQueue,是一个依赖对象的自然顺序的优先级队列.也可以由构造函数的Comparator决定其顺序.
SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的.同步队列没有任何内部容量.

阻塞队列代码示例:

public class BlockingQueueTest {
	public static void main(String[] args) {
		test();
	}

	static final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(3);

	static class Producer implements Runnable {
		public void run() {
			try {
				while (true) {
					queue.put("some thing");
					//...
				}
			} catch (InterruptedException e) {
			}
			
		}
	}

	static class Consumer implements Runnable {
		public void run() {
			try {
				while (true) {
					queue.take();
					//...
				}
			} catch (InterruptedException e) {
			}
		}
	}

	public static void test() {
		ExecutorService service = Executors.newCachedThreadPool();
		Producer producer = new Producer();
		Consumer consumer = new Consumer();
		service.submit(producer);
		service.submit(consumer);

		// 程序运行5s后,所有任务停止
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
		}

		service.shutdownNow();
		
	}
}
posted @ 2014-07-25 21:48  小样儿1020  阅读(418)  评论(0编辑  收藏  举报