อะไรจะเป็นการใช้งานจริงของDelayQueueปัญหาทั่วไปที่ได้รับการออกแบบมาเพื่อแก้ไขคืออะไร
อะไรจะเป็นการใช้งานจริงของDelayQueueปัญหาทั่วไปที่ได้รับการออกแบบมาเพื่อแก้ไขคืออะไร
คำตอบ:
ฉันเพิ่งใช้คิวหน่วงเวลาเพื่อ จำกัด อัตรา
สำหรับการ จำกัด เหตุการณ์ X ต่อวินาทีให้วางแต่ละเหตุการณ์ในคิวการหน่วงเวลาด้วยการหน่วงเวลา 1 วินาที
หากมีเหตุการณ์ X ใน delayQueue ให้ใช้ () จากคิว (ซึ่งจะบล็อกจนกว่าจะหมดอายุอย่างน้อย 1 ครั้ง) ด้วยวิธีนี้คุณจะสามารถระเบิดระยะสั้นได้โดยไม่เกินขีด จำกัด ระยะยาว
คลาสนี้เหมาะสำหรับเธรดที่ต้องการประมวลผลเหตุการณ์ที่ล่าช้าหลายรายการตามลำดับที่เหมาะสม
ตัวอย่างเช่นสมมติว่าคุณมีจอแสดงผลที่มีไฟกะพริบ 100 ดวงและไฟทั้งหมดจะกะพริบในอัตราที่ไม่เกี่ยวข้องกัน คุณสามารถมีเธรดสำหรับแต่ละไฟหรือคุณอาจมีหนึ่งเธรดประสานงานทั้งหมดโดยใช้คลาสนี้ มันจะทำงานบางอย่างเช่นนี้:
Light
คลาสพร้อมอัตราแฟลชDelayed
อินเทอร์เฟซที่ชี้ไปที่แสงสว่างLightFlash
DelayQueue
และเพิ่มใหม่LightFlash
สำหรับแต่ละแสงด้วยการตั้งค่าความล่าช้าที่เหมาะสมสำหรับอัตราแสงแฟลชDelayQueue ดูแลการประมวลผลเหตุการณ์ถัดไป
สองตัวอย่างจากโลกแห่งความจริงที่ฉันสามารถคิด:
DelayQueue
อาจจะนำมาใช้เป็นคิวลำดับความสำคัญซึ่งโดยทั่วไปจะมีการใช้งานที่ดีที่สุดเป็นกอง
การใช้งานหลักจะเป็นตัวจับเวลางานเช่นสำหรับชั้นเรียนจับเวลา
ถ้าใครสามารถทำให้ความล่าช้าเป็นอิสระจากนาฬิการะบบ (ซึ่งฉันเชื่อว่าคุณทำได้ไม่แน่ใจ) คุณสามารถใช้มันสำหรับกิจกรรมเกมเช่น "หลังจาก 5 เห็บย้ายไปที่ X" (มิฉะนั้นนาฬิกากระวนกระวายใจ wold ทำให้ไม่น่าเชื่อถือ)
โปรดทราบว่าความล่าช้าเกี่ยวข้องกับองค์ประกอบที่ไปในคิวมากกว่าคิวเอง วัตถุบางอย่างที่เข้าสู่คิวอาจมีความล่าช้าเป็นศูนย์ในขณะที่บางวัตถุอาจมีความล่าช้าที่ยาวนานกว่ามาก:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html
ด้วยความคิดนี้ฉันสามารถนึกถึงกรณีการใช้งานเล็กน้อย - แม้ว่าพวกเขาอาจจะบอบบางและมีกลิ่นเล็กน้อยเกี่ยวกับการรับส่งข้อความของคุณ ฉันจะใช้ทางเลือกกับทุกคนยกเว้นในสถานการณ์เฉพาะ:
1) การควบคุมการไหล - เรารู้ว่าคำสั่งซื้อใช้เวลา 60 วินาทีในการประมวลผลดังนั้นอย่าอ่านคำสั่งถัดไปจากคิวจนกว่าวัตถุจะอยู่ที่นั่นอย่างน้อย 60 วินาที
2) การไหลของข้อความ - ระบบอะซิงโครนัสสูงที่เราส่งการร้องขอไปยังบริการภายนอก 2 หรือ 3 บริการจากนั้นปล่อยงานถัดไปเพื่อประมวลผลคำสั่ง N วินาทีต่อมาเมื่อเรารู้ว่างานแรกจะมีโอกาสสำเร็จ .
3) การแบทช์ข้อความ - คำสั่งซื้อบางประเภทอาจระเบิดได้ดังนั้นอย่าให้ดำเนินการตามคำสั่งซื้อที่ได้รับในช่วง N วินาทีที่ผ่านมาเพื่อให้เราสามารถดูว่าคำสั่งซื้อที่คล้ายกันเข้ามาไม่นานหลังจากนั้น
4) ลำดับความสำคัญของข้อความ - ข้อความที่แตกต่างกันหรือลูกค้าที่แตกต่างกันอาจได้รับบริการที่มีคุณภาพสูงขึ้นเล็กน้อยโดยมีความล่าช้าน้อยกว่าหรือไม่มีเลย
ในบางกรณีวัตถุที่คุณวางในคิวควรอยู่ในคิวนั้นเป็นระยะเวลาหนึ่งก่อนที่วัตถุเหล่านั้นจะพร้อมสำหรับการถอนออก นี่คือที่ที่คุณใช้คลาส java.util.concurrent.DelayQueue ซึ่งใช้อินเตอร์เฟส BlockingQueue DelayQueue ต้องการให้วัตถุคิวต้องอยู่ในคิวตามระยะเวลาที่กำหนด
สำหรับตัวอย่างการใช้งานในโลกแห่งความเป็นจริงดูที่การโยงบทความในไซต์ devx
... ตัวอย่างโลกแห่งความจริงที่ฉันคิดว่าจะอธิบายเรื่องนี้ (ซึ่งอาจทำให้คุณหิว) เกี่ยวข้องกับมัฟฟิน วัตถุมัฟฟิน (ในขณะที่เรากำลังพูดภาษาจาวาอยู่นั้นไม่จำเป็นต้องใช้กาแฟ) สมมติว่าคุณมี DelayQueue ซึ่งคุณวางมัฟฟินออบเจ็กต์ ... โดยปกติแล้วเมธอด getDelay จะระบุว่ามีเวลาเหลือเท่าใดที่วัตถุจะถูกเก็บไว้ใน DelayQueue เมื่อจำนวนที่ส่งคืนโดยวิธีนี้กลายเป็นศูนย์หรือน้อยกว่าศูนย์วัตถุพร้อม (หรือในตัวอย่างนี้อบ) และได้รับอนุญาตให้ dequeued ...
เนื่องจากคุณไม่ต้องการกินมัฟฟินที่ยังไม่สุกให้วางมัฟฟินใน DelayQueue สำหรับเวลาทำอาหารที่แนะนำ ...