Panduan Antarmuka Antrean Java

1. Perkenalan

Dalam tutorial ini, kita akan membahas antarmuka Antrian Java .

Pertama, kita akan mengambil mengintip apa yang Antrian tidak, dan beberapa metode intinya . Selanjutnya, kita akan menyelami sejumlah implementasi yang disediakan Java sebagai standar.

Terakhir, kita akan berbicara tentang keamanan utas sebelum membungkus semuanya.

2. Memvisualisasikan Antrian

Mari kita mulai dengan analogi singkat.

Bayangkan kita baru saja membuka bisnis pertama kita - kedai hot dog. Kami ingin melayani klien potensial baru kami dengan cara yang paling efisien untuk bisnis kecil kami; satu per satu. Pertama, kami meminta mereka untuk membentuk barisan yang tertib di depan stand kami, dengan pelanggan baru bergabung di belakang. Berkat keahlian organisasi kami, kami sekarang dapat mendistribusikan hot dog lezat kami dengan cara yang adil.

Antrian di Java bekerja dengan cara yang sama. Setelah kami mendeklarasikan Queue kami , kami dapat menambahkan elemen baru ke belakang, dan menghapusnya dari depan.

Faktanya, sebagian besar Antrean yang akan kita temui di Java berfungsi dengan cara masuk pertama, keluar pertama ini - sering disingkat FIFO.

Namun, ada satu pengecualian yang akan kita bahas nanti.

3. Metode Inti

The Antrian menyatakan sejumlah metode yang perlu dikodekan oleh semua kelas pelaksana. Mari kita uraikan beberapa yang lebih penting sekarang:

  1. penawaran () - Menyisipkan elemen baru ke Antrian
  2. poll () - Menghapus elemen dari depan Queue
  3. peek () - Memeriksa elemen di depan Antrian, tanpa menghapusnya

4. Abstrak Antrian

AbstractQueue adalah implementasi Queue yang paling sederhana yang disediakan Java. Ini mencakup implementasi kerangka dari beberapa metode antarmuka Antrian , tidak termasuk penawaran .

Ketika kita membuat antrian kustom memperpanjang AbstractQueue kelas , kita harus menyediakan implementasi dari tawaran metode yang tidak tidak memungkinkan penyisipan elemen nol.

Selain itu, kita harus menyediakan metode mengintip, jajak pendapat, ukuran, dan java.util 's iterator .

Mari buat implementasi Queue sederhana menggunakan AbstractQueue.

Pertama, mari definisikan kelas kita dengan LinkedList untuk menyimpan elemen Queue kita :

public class CustomBaeldungQueue extends AbstractQueue { private LinkedList elements; public CustomBaeldungQueue() { this.elements = new LinkedList(); } }

Selanjutnya, mari kita ganti metode yang diperlukan dan berikan kode:

@Override public Iterator iterator() { return elements.iterator(); } @Override public int size() { return elements.size(); } @Override public boolean offer(T t) { if(t == null) return false; elements.add(t); return true; } @Override public T poll() { Iterator iter = elements.iterator(); T t = iter.next(); if(t != null){ iter.remove(); return t; } return null; } @Override public T peek() { return elements.getFirst(); }

Luar biasa, mari kita periksa apakah ini berfungsi dengan uji unit cepat:

customQueue.add(7); customQueue.add(5); int first = customQueue.poll(); int second = customQueue.poll(); assertEquals(7, first); assertEquals(5, second);

4. Sub-antarmuka

Umumnya, Antarmuka Antrean diwarisi oleh 3 sub-antarmuka utama. Blocking Queues, Transfer Queues , dan Deques .

Bersama-sama, 3 antarmuka ini diimplementasikan oleh sebagian besar Antrean Java yang tersedia . Mari kita lihat sekilas apa antarmuka ini telah ditetapkan untuk dilakukan.

4.1. Memblokir Antrian

The BlockingQueue antarmuka mendukung operasi tambahan yang benang kekuatan untuk menunggu di Antrian tergantung pada keadaan saat ini. Sebuah utas mungkin menunggu Antrian menjadi tidak kosong saat mencoba pengambilan, atau menjadi kosong saat menambahkan elemen baru.

Antrian Pemblokiran Standar termasuk LinkedBlockingQueue, SynchronousQueue, dan ArrayBlockingQueue .

Untuk informasi lebih lanjut, baca artikel kami di Blocking Queues .

4.2. Antrean Transfer

The TransferQueue antarmuka memperluas BlockingQueue antarmuka tetapi disesuaikan ke arah pola produsen-konsumen. Ini mengontrol aliran informasi dari produsen ke konsumen, menciptakan tekanan balik dalam sistem.

Java dikirimkan dengan satu implementasi antarmuka TransferQueue , LinkedTransferQueue.

4.3. Deques

Deque adalah kependekan dari D ouble- E nded Que ue dan dianalogikan dengan setumpuk kartu - elemen dapat diambil dari awal dan akhir Deque . Banyak seperti tradisional Antrian, yang deque menyediakan metode untuk menambahkan, mengambil dan mengintip elemen diadakan di kedua bagian atas dan bawah .

Untuk panduan rinci tentang cara kerja Deque , lihat artikel ArrayDeque kami .

5. Antrian Prioritas

Kami melihat sebelumnya bahwa sebagian besar Antrean yang kami temui di Jawa mengikuti prinsip FIFO.

Satu pengecualian untuk aturan ini adalah PriorityQueue . Saat elemen baru dimasukkan ke dalam Antrean Prioritas , elemen tersebut diurutkan berdasarkan pengurutan aslinya, atau oleh Pembanding yang ditentukan yang disediakan saat kita membuat Antrean Prioritas .

Mari kita lihat cara kerjanya dengan unit test sederhana:

PriorityQueue integerQueue = new PriorityQueue(); integerQueue.add(9); integerQueue.add(2); integerQueue.add(4); int first = integerQueue.poll(); int second = integerQueue.poll(); int third = integerQueue.poll(); assertEquals(2, first); assertEquals(4, second); assertEquals(9, third);

Terlepas dari urutan bilangan bulat kami ditambahkan ke Antrean Prioritas , kami dapat melihat bahwa urutan pengambilan berubah sesuai dengan urutan alami angka.

Kita dapat melihat bahwa hal yang sama juga berlaku saat diterapkan ke String :

PriorityQueue stringQueue = new PriorityQueue(); stringQueue.add("blueberry"); stringQueue.add("apple"); stringQueue.add("cherry"); String first = stringQueue.poll(); String second = stringQueue.poll(); String third = stringQueue.poll(); assertEquals("apple", first); assertEquals("blueberry", second); assertEquals("cherry", third);

6. Keamanan Benang

Adding items to Queues is particularly useful in multi-threaded environments. A Queue can be shared amongst threads, and be used to block progress until space is available – helping us overcome some common multi-threaded problems.

For example, writing to a single disk from multiple threads creates resource contention and can lead to slow writing times. Creating a single writer thread with a BlockingQueue can alleviate this issue and lead to vastly improved write speeds.

Luckily, Java offers ConcurrentLinkedQueue, ArrayBlockingQueue, and ConcurrentLinkedDeque which are thread-safe and perfect for multi-threaded programs.

7. Conclusion

Dalam tutorial ini, kami telah mempelajari lebih dalam tentang antarmuka Antrean Java .

Pertama, kita mempelajari apa yang dilakukan Queue , serta implementasi yang disediakan Java.

Berikutnya, kita melihat sebuah Antrian' prinsip FIFO biasa s, serta PriorityQueue yang berbeda dalam memesan nya.

Terakhir, kami menjelajahi keamanan thread dan bagaimana Antrian dapat digunakan di lingkungan multi-thread.

Seperti biasa, kode tersedia di GitHub.