【死记硬背】 ArrayBlockingQueue:基于数组的阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,其内部没有实现读写分离,也就意味着生成和消费不能完全并行,长度是需要定义的,可以指定先进先出或者先进后出,也叫有界队列,在很多场合非常适合适用。 LinkedBlockingQueue:基于链表的阻塞队列,同ArrayBlockingQueue类似,其内部也维持着一个数据缓冲队列,LinkedBlockingQueue之所以能够高效的处理并发数据,是因为其内部实现采用分离锁(读写分离两个锁),从而实现生产者和消费者操作的完全并行运行,它是一个无界队列。 SynchronousQueue:一种没有缓冲的队列,生产者产生的数据直接会被消费者获取并消费。 【答案解析】 ArrayBlockingQueue、LinkedBlockingQueue以及SynchronousQueue的使用代码如下: import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.TimeUnit; public class UseQueue { public static void main(String[] args) throws Exception { /**有界阻塞队列 ArrayBlockingQueuearray = new ArrayBlockingQueue (5); array.put("a"); array.put("b"); array.add("c"); array.add("d"); array.add("e"); //array.add("f"); System.out.println(array.offer("f", 3, TimeUnit.SECONDS)); */ /**无界阻塞队列 LinkedBlockingQueue q = new LinkedBlockingQueue (); q.offer("a"); q.offer("b"); q.offer("c"); q.offer("d"); q.offer("e"); q.add("f"); System.out.println(q.size()); for (Iterator iterator = q.iterator(); iterator.hasNext();) { String string = (String) iterator.next(); System.out.println(string); } List list = new ArrayList (); System.out.println(q.drainTo(list, 3)); System.out.println(list.size()); for (String string : list) { System.out.println(string); } */ final SynchronousQueue q = new SynchronousQueue (); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { System.out.println(q.take()); } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); Thread t2 = new Thread(new Runnable() { @Override public void run() { q.add("asdasd"); } }); t2.start(); } } 【温馨提示】 点赞+收藏文章,关注我并私信回复【面试题解析】,即可100%免费领取楼主的所有面试题资料!