BlockingQueue 是java.util.current下主要用来控制线程同步的工具,阻塞型队列,有四种实现类:
1,ArrayBlockingQueue 大小规定,先进先出,采用数组实现
2,LinkedBlockingQueue 大小不确定,先进先出,采用链表实现
3,PriorityBlockingQueue 自然排序,或者是构造函数的Comparator决定的顺序
4,SynchronousQueue 特殊的BlockingQueue 对其操作必须是放和取交替完成的
在实际开发过程中,使用多的一般是LinkedBlockingQueue,其访问和移除操作是在队头进行,添加是在队尾。
采用两把锁实现,在需要对两把锁同时加锁时,把加锁的顺序与释放的顺序封装成方法,确保所有地方都是一致的。而且获取锁时都是不响应中断的,一直获取直到加锁成功,这就避免了第一把锁加锁成功,而第二把锁加锁失败导致锁不释放的风险。加锁与释放锁的顺序是相反的。
put() , take(),remove() 这几个实现原理为,加锁后一直put,知道成功,释放锁。
例子:实现生产消费者模型:
package demo1; /** * 是java.util.current下主要用来控制线程同步的工具 */ import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; class Producer implements Runnable{ private BlockingQueue<String> bq; public Producer(BlockingQueue<String> bq){ this.bq=bq; } @Override public void run() { // TODO Auto-generated method stub try{ String temp="A product:"+Thread.currentThread().getName(); System.out.println("I hava made a product:"+Thread.currentThread().getName()); bq.add(temp); }catch(Exception e){ e.printStackTrace(); } } } class Consumer implements Runnable{ private BlockingQueue<String> bq; public Consumer(BlockingQueue<String> bq){ this.bq=bq; } @Override public void run() { // TODO Auto-generated method stub try{ System.out.println("有则take,没有则等待"); String temp=bq.take(); System.out.println(temp); System.out.println("若没有不会执行到这"); }catch(Exception e){ e.printStackTrace(); } } } public class BlockingQueueDemo { public static void main(String[] args) { // TODO Auto-generated method stub BlockingQueue<String> bq=new LinkedBlockingQueue<>(); Producer p=new Producer(bq); Consumer c=new Consumer(bq); for(int i=0;i<10;i++){ new Thread(p,"producer"+i).start(); new Thread(c,"consumer"+i).start(); } } }