Penggunaan DelayQueue di dunia nyata [ditutup]

18

Apa yang akan menjadi penggunaan DelayQueue di dunia nyata , masalah umum apa yang dirancang untuk dipecahkan?

Eran Medan
sumber

Jawaban:

8

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.

Andrew Hill
sumber
10

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:

  • memiliki Lightkelas dengan kecepatan flash
  • membuat implementasi Delayedantarmuka yang mengarah ke cahaya, katakanlahLightFlash
  • buat Anda DelayQueuedan tambahkan yang baru LightFlashuntuk setiap lampu, dengan penundaan yang sesuai untuk tingkat lampu kilat
  • lingkaran:

DelayQueue mengurus agar acara selanjutnya diproses.

Dua contoh dunia nyata yang dapat saya pikirkan:

  • Server (non-multithreaded) yang perlu melakukan tindakan berjangka waktu tertentu, misalnya ping koneksi pada setiap koneksi.
  • Implementasi dari browser yang mendukung javascript, yang perlu berurusan dengan jumlah kejadian acak yang dibuat sewenang-wenang yang dibuat dengan setInterval () dan setTimeout () . Oh, dan GIF animasi.

DelayQueuemungkin diimplementasikan sebagai antrian prioritas , yang umumnya diimplementasikan sebagai heap .

Michael Slade
sumber
3

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)

ratchet freak
sumber
2

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.

Benjamin Wootton
sumber
1

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 ...

Shree
sumber
1
Saya mengerti apa yang dilakukannya, tetapi bukan masalah umum yang dirancang untuk diselesaikan, saya sedang mencari use case
Eran Medan