java并发编程(十二)之 BlockingQueue

一、UML类图


1 BlockingQueue 的用法:
在 JDK中对 BlockingQueue的描述是这样的: 获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。
其意思为一个线程往BlockingQueue放元素,另外一个线程从 BlockingQueue里边取元素。
假若一个生产线程将会持续的将对象插入到队列之中,当队列满了,则这个生产线程会被阻塞,直到负责消费的线程从队列中拿走一个对象。
负责消费的线程将会一直从该阻塞队列中拿出对象,如果消费线程尝试去从一个空的队列中提取对象的话,这个消费线程将会被阻塞,直到一个生产线程把一个对象丢进队列。
2 BlockingQueue 的方法:
一共4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果请求的操作不能得到立即执行的话,每个方法的表现也不同。

二、API

三、使用案例

1.利用队列的put()与take()的阻塞特性实现线程通信

package com.dason.second;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
 * 使用队列的阻塞性实现线程通信
 * 1.put():向队列中存入数据.当队列已满,等待直到有可用的空间.
 * 2.take():从队列中取出数据.当队列为空,等待直到队列中有元素.
 * @author Dason
 *
 */
public class BlockingQueueCommunication {

	public static void main(String[] args) {
		
		final Business business = new Business();
		new Thread(
				new Runnable() {
					
					@Override
					public void run() {
						while(true) {
							business.sub("子线程");
						}
						
					}
				}
		).start();
		
		while(true) {
			business.main("主线程");
		}
		
	}

	 static class Business {
		 
		  BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
		  BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);
		  
		  //匿名构造方法:每次创建该类的实例时,在实名构造方法前被调用
		  {
			  try {
				queue2.put(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		  }
		  
		  public void sub(String str){
			  	try {
					queue1.put(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			  	System.out.println(str);
				
			  	try {
					queue2.take();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
		  }
		  
		  public void main(String str){
			  	try {
					queue2.put(1);
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
				System.out.println(str);
				try {
					queue1.take();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
		  }
	  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值