การใช้งานจริงของ DelayQueue [ปิด]


18

อะไรจะเป็นการใช้งานจริงของDelayQueueปัญหาทั่วไปที่ได้รับการออกแบบมาเพื่อแก้ไขคืออะไร

คำตอบ:


8

ฉันเพิ่งใช้คิวหน่วงเวลาเพื่อ จำกัด อัตรา

สำหรับการ จำกัด เหตุการณ์ X ต่อวินาทีให้วางแต่ละเหตุการณ์ในคิวการหน่วงเวลาด้วยการหน่วงเวลา 1 วินาที

หากมีเหตุการณ์ X ใน delayQueue ให้ใช้ () จากคิว (ซึ่งจะบล็อกจนกว่าจะหมดอายุอย่างน้อย 1 ครั้ง) ด้วยวิธีนี้คุณจะสามารถระเบิดระยะสั้นได้โดยไม่เกินขีด จำกัด ระยะยาว


10

คลาสนี้เหมาะสำหรับเธรดที่ต้องการประมวลผลเหตุการณ์ที่ล่าช้าหลายรายการตามลำดับที่เหมาะสม

ตัวอย่างเช่นสมมติว่าคุณมีจอแสดงผลที่มีไฟกะพริบ 100 ดวงและไฟทั้งหมดจะกะพริบในอัตราที่ไม่เกี่ยวข้องกัน คุณสามารถมีเธรดสำหรับแต่ละไฟหรือคุณอาจมีหนึ่งเธรดประสานงานทั้งหมดโดยใช้คลาสนี้ มันจะทำงานบางอย่างเช่นนี้:

  • มีLightคลาสพร้อมอัตราแฟลช
  • สร้างการนำDelayedอินเทอร์เฟซที่ชี้ไปที่แสงสว่างLightFlash
  • สร้างของคุณDelayQueueและเพิ่มใหม่LightFlashสำหรับแต่ละแสงด้วยการตั้งค่าความล่าช้าที่เหมาะสมสำหรับอัตราแสงแฟลช
  • ห่วง:
    • รับกับเหตุการณ์DelayQueue :: ใช้ ()
    • สลับแสงเปิด / ปิด
    • เพิ่มเหตุการณ์ใหม่คิวสำหรับแสงแฟลชของต่อไปด้วยDelayQueue :: ใส่ (E)

DelayQueue ดูแลการประมวลผลเหตุการณ์ถัดไป

สองตัวอย่างจากโลกแห่งความจริงที่ฉันสามารถคิด:

  • เซิร์ฟเวอร์ (ที่ไม่ใช่มัลติเธรด) ที่ต้องการดำเนินการตามเวลาที่กำหนดเช่นการเชื่อมต่อ ping ในแต่ละการเชื่อมต่อ
  • การดำเนินการของเบราว์เซอร์ที่เปิดใช้งานจาวาสคริปต์ที่ความต้องการที่จะจัดการกับจำนวนข้อของหมดเวลากิจกรรมที่สร้างขึ้นด้วยsetInterval ()และsetTimeout () โอ้และ GIF แบบเคลื่อนไหว

DelayQueueอาจจะนำมาใช้เป็นคิวลำดับความสำคัญซึ่งโดยทั่วไปจะมีการใช้งานที่ดีที่สุดเป็นกอง


3

การใช้งานหลักจะเป็นตัวจับเวลางานเช่นสำหรับชั้นเรียนจับเวลา

ถ้าใครสามารถทำให้ความล่าช้าเป็นอิสระจากนาฬิการะบบ (ซึ่งฉันเชื่อว่าคุณทำได้ไม่แน่ใจ) คุณสามารถใช้มันสำหรับกิจกรรมเกมเช่น "หลังจาก 5 เห็บย้ายไปที่ X" (มิฉะนั้นนาฬิกากระวนกระวายใจ wold ทำให้ไม่น่าเชื่อถือ)


2

โปรดทราบว่าความล่าช้าเกี่ยวข้องกับองค์ประกอบที่ไปในคิวมากกว่าคิวเอง วัตถุบางอย่างที่เข้าสู่คิวอาจมีความล่าช้าเป็นศูนย์ในขณะที่บางวัตถุอาจมีความล่าช้าที่ยาวนานกว่ามาก:

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html

ด้วยความคิดนี้ฉันสามารถนึกถึงกรณีการใช้งานเล็กน้อย - แม้ว่าพวกเขาอาจจะบอบบางและมีกลิ่นเล็กน้อยเกี่ยวกับการรับส่งข้อความของคุณ ฉันจะใช้ทางเลือกกับทุกคนยกเว้นในสถานการณ์เฉพาะ:

1) การควบคุมการไหล - เรารู้ว่าคำสั่งซื้อใช้เวลา 60 วินาทีในการประมวลผลดังนั้นอย่าอ่านคำสั่งถัดไปจากคิวจนกว่าวัตถุจะอยู่ที่นั่นอย่างน้อย 60 วินาที

2) การไหลของข้อความ - ระบบอะซิงโครนัสสูงที่เราส่งการร้องขอไปยังบริการภายนอก 2 หรือ 3 บริการจากนั้นปล่อยงานถัดไปเพื่อประมวลผลคำสั่ง N วินาทีต่อมาเมื่อเรารู้ว่างานแรกจะมีโอกาสสำเร็จ .

3) การแบทช์ข้อความ - คำสั่งซื้อบางประเภทอาจระเบิดได้ดังนั้นอย่าให้ดำเนินการตามคำสั่งซื้อที่ได้รับในช่วง N วินาทีที่ผ่านมาเพื่อให้เราสามารถดูว่าคำสั่งซื้อที่คล้ายกันเข้ามาไม่นานหลังจากนั้น

4) ลำดับความสำคัญของข้อความ - ข้อความที่แตกต่างกันหรือลูกค้าที่แตกต่างกันอาจได้รับบริการที่มีคุณภาพสูงขึ้นเล็กน้อยโดยมีความล่าช้าน้อยกว่าหรือไม่มีเลย


1

ในบางกรณีวัตถุที่คุณวางในคิวควรอยู่ในคิวนั้นเป็นระยะเวลาหนึ่งก่อนที่วัตถุเหล่านั้นจะพร้อมสำหรับการถอนออก นี่คือที่ที่คุณใช้คลาส java.util.concurrent.DelayQueue ซึ่งใช้อินเตอร์เฟส BlockingQueue DelayQueue ต้องการให้วัตถุคิวต้องอยู่ในคิวตามระยะเวลาที่กำหนด

สำหรับตัวอย่างการใช้งานในโลกแห่งความเป็นจริงดูที่การโยงบทความในไซต์ devx

... ตัวอย่างโลกแห่งความจริงที่ฉันคิดว่าจะอธิบายเรื่องนี้ (ซึ่งอาจทำให้คุณหิว) เกี่ยวข้องกับมัฟฟิน วัตถุมัฟฟิน (ในขณะที่เรากำลังพูดภาษาจาวาอยู่นั้นไม่จำเป็นต้องใช้กาแฟ) สมมติว่าคุณมี DelayQueue ซึ่งคุณวางมัฟฟินออบเจ็กต์ ... โดยปกติแล้วเมธอด getDelay จะระบุว่ามีเวลาเหลือเท่าใดที่วัตถุจะถูกเก็บไว้ใน DelayQueue เมื่อจำนวนที่ส่งคืนโดยวิธีนี้กลายเป็นศูนย์หรือน้อยกว่าศูนย์วัตถุพร้อม (หรือในตัวอย่างนี้อบ) และได้รับอนุญาตให้ dequeued ...

เนื่องจากคุณไม่ต้องการกินมัฟฟินที่ยังไม่สุกให้วางมัฟฟินใน DelayQueue สำหรับเวลาทำอาหารที่แนะนำ ...


1
ฉันเข้าใจสิ่งที่ทำ แต่ไม่ใช่ปัญหาทั่วไปที่ออกแบบมาเพื่อแก้ไขฉันกำลังมองหากรณีการใช้งาน
Eran Medan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.