Queue

定義前端

隊列是一種特殊的線性表,先進先出,它只容許在表的前端進行刪除,在表的後端進行插入。LinkedList類實現了Queue接口,所以咱們能夠把LinkedList當成Queue來用。java


簡單一個小 Demo後端


public static Queue<String>  queueDemo(){
    Queue<String> queue = new LinkedList<String>();
    //添加元素
    queue.offer("f");
    queue.offer("r");
    queue.offer("o");
    queue.offer("z");
    queue.offer("e");
    queue.offer("n");
    //add()和remove()方法在失敗的時候會拋出異常(不推薦)
    queue.add("redant");
    queue.remove("b");
    for(String q : queue){
        System.out.println("逐個遍歷Queue中的元素:"+q);
    }
    System.out.println("刪除隊列中的第一個元素,poll:"+queue.poll());
    System.out.println("隊列中的第一個元素,element:"+queue.element());
    System.out.println("隊列中的第一個元素,peek:"+queue.peek());
    return queue;
}
    //一、Queue隊列測試
Queue<String> sss =  QueueDemo.queueDemo();
 for(String q : sss){
     System.out.println(q);
 }

Queuedemo.png

說明app

add        增長一個元索                    若是隊列已滿,則拋出一個IIIegaISlabEepeplian異常
remove   移除並返回隊列頭部的元素    若是隊列爲空,則拋出一個NoSuchElementException異常
element  返回隊列頭部的元素             若是隊列爲空,則拋出一個NoSuchElementException異常
offer       添加一個元素並返回true       若是隊列已滿,則返回false
poll         移除並返問隊列頭部的元素    若是隊列爲空,則返回null
peek       返回隊列頭部的元素             若是隊列爲空,則返回null
put         添加一個元素                     若是隊列滿,則阻塞
take        移除並返回隊列頭部的元素     若是隊列爲空,則阻塞
ide

堆、棧、隊列之間的區別是?測試

①堆是在程序運行時,而不是在程序編譯時,申請某個大小的內存空間。即動態分配內存,對其訪問和對通常內存的訪問沒有區別。spa

②棧就是一個桶,後放進去的先拿出來,它下面原本有的東西要等它出來以後才能出來。(後進先出)線程

③隊列只能在隊頭作刪除操做,在隊尾作插入操做.而棧只能在棧頂作插入和刪除操做。(先進先出)orm


隊列之ArrayBlockingQueue測試小demoblog

ArrayBlockingQueue:須要制定容量,可選擇是否須要公平性,等待時間長的線程優先執行。

/**
 * 一輛家庭小轎車
 */
public static class FrozenCar{
    // 這輛車子,最多容納5我的{包括司機}
    BlockingQueue<String> frozenCar = new ArrayBlockingQueue<String>(5);
    // 開始shungfeng車,拉人
    public void carrerPosal() throws InterruptedException{
        // put方法載入一我的,若frozenCar滿了,等到frozenCar有位置
        frozenCar.put("pretty girl");
    }
    // 乘客到站,從frozenCar中下車
    public String consume() throws InterruptedException{
        // get方法取出一個乘客,若frozenCar爲空,等到frozenCar有蘋果爲止
        String apple = frozenCar.take();
        return apple;
    }
    public int getPosalNumber(){
        return frozenCar.size();
    }
}
// 測試方法
public static void testFrozenCar() {
    // 買一輛車
    final FrozenCar frozencar = new FrozenCar();
    // 定義乘客
    class Producer implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    System.out.println("準備拉乘客:" + System.currentTimeMillis());
                    frozencar.carrerPosal();
                    System.out.println("乘客已上車:" + System.currentTimeMillis());
                    System.out.println("車上還有:"+frozencar.getPosalNumber()+"人");
                    Thread.sleep(1000);   // 休眠1秒
                }
            } catch (InterruptedException ex) {
            }
        }
    }
    // 定義乘客
    class Consumer implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    System.out.println("乘客要下車:" + System.currentTimeMillis());
                    frozencar.consume();
                    System.out.println("乘客已下車:" + System.currentTimeMillis());
                    System.out.println("車上還有:"+frozencar.getPosalNumber()+"人");
                    Thread.sleep(1000);// 休眠1s
                }
            } catch (InterruptedException ex) {
            }
        }
    }
    ExecutorService service = Executors.newCachedThreadPool();
    Producer producer = new Producer();
    Consumer consumer = new Consumer();
    service.submit(producer);
    service.submit(consumer);
    // 程序運行10s後,全部任務中止
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
    }
    service.shutdownNow();
}
//二、ArrayBlockingQueue測試
QueueDemo.testFrozenCar();
相關文章
相關標籤/搜索