日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

初學者java入門基礎(chǔ)知識 java雙端隊列原理( 四 )



6.關(guān)于 ArrayBlockingQueue 說法不正確的是?A:ArrayBlockingQueue 是線程安全的 B:ArrayBlockingQueue 元素允許為 null C:ArrayBlockingQueue 主要應用場景是“生產(chǎn)者-消費者”模型 D:ArrayBlockingQueue 必須顯示地設置容量 答:B 題目解析:ArrayBlockingQueue 不允許元素為 null , 如果添加一個 null 元素 , 會拋 NullPointerException 異常 。
7.以下程序執(zhí)行的結(jié)果是什么?PriorityQueue priorityQueue = new PriorityQueue();priorityQueue.add(null);System.out.println(priorityQueue.size());答:程序執(zhí)行報錯 , PriorityQueue 不能插入 null 。
8.Java 中常見的阻塞隊列有哪些?答:Java 中常見的阻塞隊列如下:

  • ArrayBlockingQueue , 由數(shù)組結(jié)構(gòu)組成的有界阻塞隊列;
  • PriorityBlockingQueue , 支持優(yōu)先級排序的無界阻塞隊列;
  • SynchronousQueue , 是一個不存儲元素的阻塞隊列 , 會直接將任務交給消費者 , 必須等隊列中的添加元素被消費后才能繼續(xù)添加新的元素;
  • LinkedBlockingQueue , 由鏈表結(jié)構(gòu)組成的阻塞隊列;
  • DelayQueue , 支持延時獲取元素的無界阻塞隊列 。
9.有界隊列和無界隊列有哪些區(qū)別?答:有界隊列和無界隊列的區(qū)別如下:
  • 有界隊列:有固定大小的隊列叫做有界隊列 , 比如:new ArrayBlockingQueue(6) , 6 就是隊列的大小 。
  • 無界隊列:指的是沒有設置固定大小的隊列 , 這些隊列的特點是可以直接入列 , 直到溢出 。它們并不是真的無界 , 它們最大值通常為 Integer.MAXVALUE , 只是平常很少能用到這么大的容量(超過 Integer.MAXVALUE) , 因此從使用者的體驗上 , 就相當于 “無界” 。
10.如何手動實現(xiàn)一個延遲消息隊列?答:說到延遲消息隊列 , 我們應該可以第一時間想到要使用 DelayQueue 延遲隊列來解決這個問題 。實現(xiàn)思路 , 消息隊列分為生產(chǎn)者和消費者 , 生產(chǎn)者用于增加消息 , 消費者用于獲取并消費消息 , 我們只需要生產(chǎn)者把消息放入到 DelayQueue 隊列并設置延遲時間 , 消費者循環(huán)使用 take() 阻塞獲取消息即可 。完整的實現(xiàn)代碼如下:
public class CustomDelayQueue {// 消息編號static AtomicInteger MESSAGENO = new AtomicInteger(1);public static void main(String[] args) throws InterruptedException {DelayQueue<DelayedElement> delayQueue = new DelayQueue<>();// 生產(chǎn)者1producer(delayQueue, "生產(chǎn)者1");// 生產(chǎn)者2producer(delayQueue, "生產(chǎn)者2");// 消費者consumer(delayQueue);}//生產(chǎn)者private static void producer(DelayQueue<DelayedElement> delayQueue, String name) {new Thread(new Runnable() {@Overridepublic void run() {while (true) {// 產(chǎn)生 1~5 秒的隨機數(shù)long time = 1000L * (new Random().nextInt(5) + 1);try {Thread.sleep(time);} catch (InterruptedException e) {e.printStackTrace();}// 組合消息體String message = String.format("%s , 消息編號:%s 發(fā)送時間:%s 延遲:%s 秒",name, MESSAGENO.getAndIncrement(), DateFormat.getDateTimeInstance().format(new Date()), time / 1000);// 生產(chǎn)消息delayQueue.put(new DelayedElement(message, time));}}}).start();}//消費者private static void consumer(DelayQueue<DelayedElement> delayQueue) {new Thread(new Runnable() {@Overridepublic void run() {while (true) {DelayedElement element = null;try {// 消費消息element = delayQueue.take();System.out.println(element);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();} // 延遲隊列對象static class DelayedElement implements Delayed {// 過期時間(單位:毫秒)long time = System.currentTimeMillis();// 消息體String message;// 參數(shù):delayTime 延遲時間(單位毫秒)public DelayedElement(String message, long delayTime) {this.time += delayTime;this.message = message;}@Override// 獲取過期時間public long getDelay(TimeUnit unit) {return unit.convert(time - System.currentTimeMillis(), TimeUnit.MILLISECONDS);}@Override// 隊列元素排序public int compareTo(Delayed o) {if (this.getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS))return 1;else if (this.getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS))return -1;elsereturn 0;}@Overridepublic String toString() {// 打印消息return message + " |執(zhí)行時間:" + DateFormat.getDateTimeInstance().format(new Date());}}}

推薦閱讀