@lzb1096101803
2016-03-10T03:01:22.000000Z
字数 4587
阅读 560
电话面试
1.BlockingQueue定义的常用方法如下:
1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则报异常
2)offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
3)put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续. 会直接返回false。
4)poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止
2.BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类
1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的.
2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的
3)PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序.
4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的.
具体实现
(1)wait() / notify()方法
(2)await() / signal()方法
(3)BlockingQueue阻塞队列方法
(4)PipedInputStream / PipedOutputStream
http://blog.csdn.net/monkey_d_meng/article/details/6251879
这里列出第一钟
import java.util.LinkedList;/*** 仓库类Storage实现缓冲区** Email:530025983@qq.com** @author MONKEY.D.MENG 2011-03-15**/public class Storage{// 仓库最大存储量private final int MAX_SIZE = 100;// 仓库存储的载体private LinkedList<Object> list = new LinkedList<Object>();// 生产num个产品public void produce(int num){// 同步代码段synchronized (list){// 如果仓库剩余容量不足while (list.size() + num > MAX_SIZE){System.out.println("【要生产的产品数量】:" + num + "/t【库存量】:"+ list.size() + "/t暂时不能执行生产任务!");try{// 由于条件不满足,生产阻塞list.wait();}catch (InterruptedException e){e.printStackTrace();}}// 生产条件满足情况下,生产num个产品for (int i = 1; i <= num; ++i){list.add(new Object());}System.out.println("【已经生产产品数】:" + num + "/t【现仓储量为】:" + list.size());list.notifyAll();}}// 消费num个产品public void consume(int num){// 同步代码段synchronized (list){// 如果仓库存储量不足while (list.size() < num){System.out.println("【要消费的产品数量】:" + num + "/t【库存量】:"+ list.size() + "/t暂时不能执行生产任务!");try{// 由于条件不满足,消费阻塞list.wait();}catch (InterruptedException e){e.printStackTrace();}}// 消费条件满足情况下,消费num个产品for (int i = 1; i <= num; ++i){list.remove();}System.out.println("【已经消费产品数】:" + num + "/t【现仓储量为】:" + list.size());list.notifyAll();}}// get/set方法public LinkedList<Object> getList(){return list;}public void setList(LinkedList<Object> list){this.list = list;}public int getMAX_SIZE(){return MAX_SIZE;}}/*** 生产者类Producer继承线程类Thread** Email:530025983@qq.com** @author MONKEY.D.MENG 2011-03-15**/public class Producer extends Thread{// 每次生产的产品数量private int num;// 所在放置的仓库private Storage storage;// 构造函数,设置仓库public Producer(Storage storage){this.storage = storage;}// 线程run函数public void run(){produce(num);}// 调用仓库Storage的生产函数public void produce(int num){storage.produce(num);}// get/set方法public int getNum(){return num;}public void setNum(int num){this.num = num;}public Storage getStorage(){return storage;}public void setStorage(Storage storage){this.storage = storage;}}/*** 消费者类Consumer继承线程类Thread** Email:530025983@qq.com** @author MONKEY.D.MENG 2011-03-15**/public class Consumer extends Thread{// 每次消费的产品数量private int num;// 所在放置的仓库private Storage storage;// 构造函数,设置仓库public Consumer(Storage storage){this.storage = storage;}// 线程run函数public void run(){consume(num);}// 调用仓库Storage的生产函数public void consume(int num){storage.consume(num);}// get/set方法public int getNum(){return num;}public void setNum(int num){this.num = num;}public Storage getStorage(){return storage;}public void setStorage(Storage storage){this.storage = storage;}}/*** 测试类Test** Email:530025983@qq.com** @author MONKEY.D.MENG 2011-03-15**/public class Test{public static void main(String[] args){// 仓库对象Storage storage = new Storage();// 生产者对象Producer p1 = new Producer(storage);Producer p2 = new Producer(storage);Producer p3 = new Producer(storage);Producer p4 = new Producer(storage);Producer p5 = new Producer(storage);Producer p6 = new Producer(storage);Producer p7 = new Producer(storage);// 消费者对象Consumer c1 = new Consumer(storage);Consumer c2 = new Consumer(storage);Consumer c3 = new Consumer(storage);// 设置生产者产品生产数量p1.setNum(10);p2.setNum(10);p3.setNum(10);p4.setNum(10);p5.setNum(10);p6.setNum(10);p7.setNum(80);// 设置消费者产品消费数量c1.setNum(50);c2.setNum(20);c3.setNum(30);// 线程开始执行c1.start();c2.start();c3.start();p1.start();p2.start();p3.start();p4.start();p5.start();p6.start();p7.start();}}【要消费的产品数量】:50 【库存量】:0 暂时不能执行生产任务!【要消费的产品数量】:30 【库存量】:0 暂时不能执行生产任务!【要消费的产品数量】:20 【库存量】:0 暂时不能执行生产任务!【已经生产产品数】:10 【现仓储量为】:10【要消费的产品数量】:20 【库存量】:10 暂时不能执行生产任务!【要消费的产品数量】:30 【库存量】:10 暂时不能执行生产任务!【要消费的产品数量】:50 【库存量】:10 暂时不能执行生产任务!【已经生产产品数】:10 【现仓储量为】:20【要消费的产品数量】:50 【库存量】:20 暂时不能执行生产任务!【要消费的产品数量】:30 【库存量】:20 暂时不能执行生产任务!【已经消费产品数】:20 【现仓储量为】:0【已经生产产品数】:10 【现仓储量为】:10【已经生产产品数】:10 【现仓储量为】:20【已经生产产品数】:80 【现仓储量为】:100【要生产的产品数量】:10 【库存量】:100 暂时不能执行生产任务!【已经消费产品数】:30 【现仓储量为】:70【已经消费产品数】:50 【现仓储量为】:20【已经生产产品数】:10 【现仓储量为】:30【已经生产产品数】:10 【现仓储量为】:40