Apa yang akan menjadi penggunaan DelayQueue di dunia nyata , masalah umum apa yang dirancang untuk dipecahkan?
Apa yang akan menjadi penggunaan DelayQueue di dunia nyata , masalah umum apa yang dirancang untuk dipecahkan?
Jawaban:
Saya baru-baru ini menggunakan antrian keterlambatan untuk membatasi tingkat.
Untuk batas peristiwa X per detik, tempatkan setiap peristiwa ke dalam antrean penundaan dengan penundaan 1 detik.
Jika ada peristiwa X pada delayQueue, ambil () dari antrian (yang memblokir hingga setidaknya 1 berakhir). Dengan begitu Anda membiarkan ledakan jangka pendek, tanpa melebihi batas jangka panjang.
Kelas ini sangat cocok untuk utas yang ingin memproses beberapa acara yang tertunda sesuai urutannya.
Misalkan, misalnya, Anda memiliki layar dengan 100 lampu berkedip, dan semua lampu berkedip dengan kecepatan yang berbeda terkait. Anda dapat memiliki utas untuk setiap lampu, atau Anda dapat memiliki satu utas mengoordinasikan semuanya menggunakan kelas ini. Ini akan bekerja seperti ini:
Light
kelas dengan kecepatan flashDelayed
antarmuka yang mengarah ke cahaya, katakanlahLightFlash
DelayQueue
dan tambahkan yang baru LightFlash
untuk setiap lampu, dengan penundaan yang sesuai untuk tingkat lampu kilatDelayQueue mengurus agar acara selanjutnya diproses.
Dua contoh dunia nyata yang dapat saya pikirkan:
DelayQueue
mungkin diimplementasikan sebagai antrian prioritas , yang umumnya diimplementasikan sebagai heap .
penggunaan utama akan menjadi pengatur waktu seperti untuk kelas Timer
jika seseorang dapat membuat penundaan independen dari jam sistem (yang saya percaya Anda bisa, meskipun tidak yakin) Anda dapat menggunakannya untuk acara-acara permainan seperti "setelah 5 ticks pindah ke X" (jika jam jitter wold membuat ini tidak dapat diandalkan)
Perhatikan bahwa penundaan dikaitkan dengan elemen yang masuk dalam antrian alih-alih antrian itu sendiri. Beberapa objek yang masuk ke antrian bisa memiliki penundaan nol, sementara beberapa objek dapat memiliki penundaan yang lebih lama:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html
Dengan mengingat hal ini, saya dapat memikirkan beberapa kasus penggunaan - meskipun mereka mungkin rapuh dan sedikit bau kode sehubungan dengan aliran pesan Anda. Saya akan menggunakan alternatif untuk semuanya kecuali dalam situasi tertentu:
1) Alur kontrol - kami tahu bahwa pesanan membutuhkan waktu 60 detik untuk diproses, jadi jangan membaca urutan berikutnya dari antrian hingga objek telah ada di sana setidaknya selama 60 detik.
2) Alur pesan - Sistem yang sangat asinkron di mana kami mengirim permintaan ke 2 atau 3 layanan eksternal dan kemudian melepaskan tugas berikutnya untuk memproses pesanan N detik kemudian setelah kami tahu batch pekerjaan pertama setidaknya akan memiliki kesempatan untuk menyelesaikan .
3) Kumpulan pesan - mungkin pesanan dari jenis tertentu meledak, jadi jangan memproses pesanan yang diterima dalam N detik terakhir sehingga kita dapat melihat apakah pesanan yang sama datang tidak lama setelah itu dapat diproses sebagai batch pada proses berikutnya.
4) Prioritas pesan - pesan yang berbeda atau pelanggan yang berbeda bisa mendapatkan kualitas layanan yang sedikit lebih tinggi dengan penundaan lebih rendah atau nol.
Dalam beberapa kasus, objek yang Anda tempatkan di antrian harus berada di antrian itu untuk jangka waktu tertentu sebelum mereka siap untuk dikosongkan. Di sinilah Anda menggunakan kelas java.util.concurrent.DelayQueue, yang mengimplementasikan antarmuka BlockingQueue. DelayQueue mengharuskan objek antrian tetap di antrian untuk jangka waktu tertentu.
Untuk contoh penggunaan dunia nyata, lihat Mengatasi artikel Antrian di situs devx
... Contoh dunia nyata yang saya pikirkan untuk menggambarkan hal ini (yang mungkin membuat Anda lapar) melibatkan muffin. Yah, benda-benda Muffin (seperti kita berbicara tentang Jawa — tidak ada kata pun kopi yang dimaksudkan). Misalkan Anda memiliki DelayQueue tempat Anda meletakkan objek Muffin ... Metode getDelay, pada dasarnya, menyatakan berapa banyak waktu yang tersisa untuk objek disimpan di DelayQueue. Ketika angka yang dikembalikan oleh metode ini menjadi nol atau kurang dari nol, objek sudah siap (atau dalam contoh ini, dipanggang) dan dibiarkan dequeued ...
Karena Anda tidak benar-benar ingin makan Muffin yang belum matang sepenuhnya, letakkan Muffin di DelayQueue untuk waktu memasak yang disarankan ...