要想實現EventQueue,那麼該Queue應有的三種狀態代碼,都在這了

2020-12-14 編程小課堂

實現一個EventQueue,該Queue有如下三種狀態:

隊列滿——最多可容納多少個Event,好比一個系統最多同時能夠受理多少業務一樣;

隊列空——當所有的Event都被處理並且沒有新的Event被提交的時候,此時隊列將是空的狀態;

有Event但是沒有滿——有新的Event被提交,但是此時沒有到達隊列的上限。

示例代碼如下:

package com. wangwenjun. concurrent. chapter05;

import java. util. LinkedList;

import static java. lang. Thread. currentThread;

public class EventQueue private final int max;

static class Event private final LinkedList<Event>eventQueue

=new LinkedList<>(); private final static int DEFAULT MAX_EVENT=10;

public EventQueue()

{

this(DEFAULT_MAX_EVENT);

}

public EventQueue(int max)

{

this. max=max; public void offer(Event event)

{

synchronized(eventQueue)

if (eventQueue. size()>=max)

try

{

console("the queue is full.");

eventQueue. wait();

}

}

catch (InterruptedException e)

e. printStackTrace(); console("the new event is submitted");

eventQueue. addLast(event); eventQueue. notify();

}

}

public Event take()

{

synchronized(eventQueue)

if (eventQueue. isEmpty())

try

{

console("the queue is empty.");

eventQueue. wait();

}

catch (InterruptedE

xception e)

e. printStackTrace();

}

Event event=eventQueue. removeFirst();

this. eventQueue. notify(); console("the event"+event +"is handled.");

return event;

}

private void console(String message)

{

System. out. printf("8s:8s\n", currentThread(). getName

}

}

上述代碼,就是實現EventQueue,該Queue應有的三種狀態的示例代碼了,在EventQueue中定義了一個隊列,offer方法會提交一個Event至隊尾,如果此時隊列已經滿了,那麼提交的線程將會被阻塞,這是調用了wait方法的結果。同樣take方法會從隊頭獲取數據,如果隊列中沒有可用數據,那麼工作線程就會被阻塞,這也是調用wait方法的直接結果。

相關焦點

  • 深入理解Java PriorityQueue
    Java中PriorityQueue實現了Queue接口,不允許放入null元素;其通過堆實現,具體說是通過完全二叉樹(complete binary tree)實現的小頂堆(任意一個非葉子節點的權值,都不大於其左右子節點的權值),也就意味著可以通過數組來作為PriorityQueue的底層實現。
  • C++ 優先隊列priority_queue
    隊列就不用多說了,一個先進先出的經典數據結構,那麼優先隊列是個什麼鬼,其實它就是在隊列的基礎上加上優先兩個字,想想怎樣才能優先呢?沒錯——排隊!只有排好了隊伍才會有落後和優先之分,否則一團亂糟糟的,怎麼才能分出優先的,所以優先隊列一定應用了排序。可是排序要怎樣實現呢?
  • Python使用Queue對象實現多線程同步小案例
    queue模塊的Queue對象實現了多生產者/多消費者隊列,尤其適合需要在多個線程之間進行信息交換的場合,實現了多線程編程所需要的所有鎖語義。
  • Python 進階:queue 隊列源碼分析
    然後就是線程鎖 self.mutex ,對於底層數據結構 self.queue 的操作都要先獲得這把鎖;再往下是三個條件變量,這三個 Condition 都以 self.mutex 作為參數,也就是說它們共用一把鎖;從這可以知道諸如 with self.mutex 與 with self.not_empty 等都是互斥的。
  • C++複習篇(9)-詳解deque、stack、queue的實現原理
    vector雖然也可以在頭尾兩端進行插入和刪除,但是頭部操作的效率奇差,需要之後的元素都向前移動。    1、deque能夠在常數時間在頭端插入和刪除元素;    2、deque沒有容量的觀念,因為它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並連結起來。
  • Python 源碼分析:queue 隊列模塊
    然後就是線程鎖 self.mutex ,對於底層數據結構 self.queue 的操作都要先獲得這把鎖;再往下是三個條件變量,這三個 Condition 都以 self.mutex 作為參數,也就是說它們共用一把鎖;從這可以知道諸如with self.mutex與 with self.not_empty 等都是互斥的。
  • Event Loop 解疑
    譯者說:文章藉助讀取文件時的「同步」和「異步」兩種模式來解釋 Event Loop 到底要解決什麼問題,並用偽代碼的方式說明一個簡單的 Event Loop 是如何實現的。最後,文章還猜測了 V8 引擎的 Event Loop 工作原理。
  • python筆記29-隊列Queue
    前言Python的Queue模塊提供一種適用於多線程編程的FIFO實現。
  • Postfix queue(郵件隊列) 管理
    From time to time the mail queue may get filled up.本文引用地址:http://www.eepw.com.cn/article/201609/304130.htm1. try and deliver the mail from the queue(強制發送隊列中的郵件):$ postfix flush or $ postqueue
  • 控制renderQueue解決NGUI與Unity3D物體渲染順序問題
    之前鄧老師就這一問題,專門做了一次分享。鄧老師在分享時也指出了這類問題的根源:由於UI與特效等都是以transparent方式渲染,而Unity與NGUI在管理同是透明物體的render queue時實際上互相沒有感知,於是引出排序問題。
  • java 基礎 之 集合 Map 與Set 與Queue
    從Java源碼來看, Java是先實現了Map,然後通過包裝一個所有value都為null的Map就實現了Set集合。如果把Map裡的所有value放在一起來看,它們又非常類似於一個List:元素與元素之間可以重複,每個元素可以根據索引來查找,只是Map中的索引不再使用整數值,而是以另一個對象作為索引。
  • Event Loop的規範和實現
    (本文所有代碼運行環境僅包含Node v8.9.4以及 Chrome v63)PART 1:規範為什麼要有Event Loop?因為Javascript設計之初就是一門單線程語言,因此為了實現主線程的不阻塞,Event Loop這樣的方案應運而生。小測試(1)先來看一段代碼,列印結果會是?
  • 【crossbeam系列】5 crossbeam-util和crossbeam-queue:一些實用的小東西
    這一次我們來介紹一下crossbeam-util和crossbeam-queue,中的一些東西和用法。
  • He jumped the queue是說他在隊伍裡亂跳嗎?原來他是插隊!
    queue指的是「隊伍」的意思,jump則是「跳躍」,jump the queue指的就是插隊。同義可說cut the line(切進隊伍裡),也是插隊之意,不過jump the queue通常是指有人非常無禮地亂插隊時。
  • 如何使用Spring Boot與RabbitMQ結合實現延遲隊列
    顧名思義,延遲隊列就是進入該隊列的消息會被延遲消費的隊列。而一般的隊列,消息一旦入隊了之後就會被消費者馬上消費。延遲隊列能做什麼?延遲隊列多用於需要延遲工作的場景。最常見的是以下兩種場景:延遲消費。比如:用戶生成訂單之後,需要過一段時間校驗訂單的支付狀態,如果訂單仍未支付則需要及時地關閉訂單。
  • Vue的異步更新實現原理
    for(let i=1; i<=100; i++){console.log(i);}複製代碼這就涉及到Vue底層的異步更新原理,也要說一說nextTick的實現。不過在說nextTick之前,有必要先介紹一下JS的事件運行機制。
  • 一行代碼實現Python並行處理
    我並不是說使用生產者/消費者模型處理多線程/多進程任務是錯誤的(事實上,這一模型自有其用武之地)。只是,處理日常腳本任務時我們可以使用更有效率的模型。問題在於…而且,你還需要在通道兩端都構建相應的方法來協助其工作(如果需想要進行雙向通信或是保存結果還需要再引入一個隊列)。
  • 英語語法:短語put up with,queue up的用法​
    290.queue up排隊(等候)用法:queue up可以跟介詞for連用引出具體對象。 例句:Many elderly people go to the supermarket every day to queue up for discount goods.很多老人每天都去超市排隊買打折商品。