Dalam tutorial ini, kita akan belajar mengenai antara muka Java BlockingQueue dan kaedahnya.
Antara BlockingQueue
muka Collections
kerangka Java memperluas Queue
antara muka. Ia membolehkan sebarang operasi menunggu sehingga berjaya dilaksanakan.
Sebagai contoh, jika kita ingin menghapus elemen dari barisan kosong, maka barisan penyekat membolehkan operasi hapus menunggu sehingga barisan mengandungi beberapa elemen yang akan dihapus.
Kelas yang Melaksanakan BlockingQueue
Oleh kerana BlockingQueue
merupakan antara muka, kami tidak dapat memberikan pelaksanaannya secara langsung.
Untuk menggunakan fungsi BlockingQueue
, kita perlu menggunakan kelas yang melaksanakannya.
- ArrayBlockingQueue
- LinkedBlockingQueue
Bagaimana menggunakan barisan penyekat?
Kita mesti mengimport java.util.concurrent.BlockingQueue
pakej untuk digunakan BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Di sini, kami telah membuat objek animal1 dan animal2 kelas ArrayBlockingQueue
dan LinkedBlockingQueue
, masing-masing. Objek-objek ini dapat menggunakan fungsi BlockingQueue
antara muka.
Kaedah BlockingQueue
Berdasarkan sama ada giliran penuh atau kosong, kaedah menyekat barisan boleh dibahagikan kepada 3 kategori:
Kaedah yang membuang pengecualian
add()
- Memasukkan elemen ke barisan penyekat di akhir barisan. Melontarkan pengecualian sekiranya barisan penuh.element()
- Mengembalikan kepala barisan penyekat. Melontarkan pengecualian sekiranya barisan kosong.remove()
- Mengeluarkan elemen dari barisan penyekat. Melontarkan pengecualian sekiranya barisan kosong.
Kaedah yang mengembalikan beberapa nilai
offer()
- Memasukkan elemen yang ditentukan ke barisan penyekat pada akhir barisan. Kembalifalse
sekiranya barisan penuh.peek()
- Mengembalikan kepala barisan penyekat. Kembalinull
jika barisan kosong.poll()
- Mengeluarkan elemen dari barisan penyekat. Kembalinull
jika barisan kosong.
Lebih banyak ditawarkan () dan tinjauan pendapat ()
Yang offer()
dan poll()
kaedah boleh digunakan dengan tamat masa. Artinya, kita dapat melewati unit waktu sebagai parameter. Sebagai contoh,
offer(value, 100, milliseconds)
Di sini,
- nilai adalah elemen yang akan dimasukkan ke dalam barisan
- Dan kami telah menetapkan masa tamat 100 milisaat
Ini bermaksud offer()
kaedah akan cuba memasukkan elemen ke dalam barisan penyekat untuk 100
milisaat. Sekiranya elemen tidak dapat dimasukkan dalam 100 milisaat, kaedah akan kembali false
.
Nota: Daripada milliseconds
, kita juga boleh menggunakan unit masa: days
, hours
, minutes
, seconds
, microseconds
dan nanoseconds
dalam offer()
dan poll()
kaedah.
Kaedah yang menyekat operasi
Ini BlockingQueue
juga menyediakan kaedah untuk menyekat operasi dan menunggu jika barisan penuh atau kosong.
put()
- Memasukkan elemen ke dalam barisan penyekat. Sekiranya barisan penuh, ia akan menunggu sehingga barisan mempunyai ruang untuk memasukkan elemen.take()
- Mengeluarkan dan mengembalikan elemen dari barisan penyekat. Sekiranya barisan kosong, ia akan menunggu sehingga barisan mempunyai elemen yang akan dihapuskan.
Katakan, kami ingin memasukkan elemen ke dalam barisan. Sekiranya barisan penuh maka put()
kaedah akan menunggu sehingga barisan mempunyai ruang untuk memasukkan elemen.
Begitu juga, jika kita mahu memadamkan elemen dari barisan. Sekiranya barisan kosong maka take()
kaedah akan menunggu sehingga barisan mengandungi elemen yang akan dihapuskan.
Pelaksanaan BlockingQueue di ArrayBlockingQueue
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) )
Pengeluaran
BlockingQueue: (2, 1, 3) Elemen yang Dihapus: 2
Untuk mengetahui lebih lanjut mengenai ArrayBlockingQueue
, kunjungi Java ArrayBlockingQueue.
Mengapa BlockingQueue?
Di Jawa, BlockingQueue
dianggap sebagai koleksi benang yang selamat . Ini kerana ia dapat membantu dalam operasi multi-threading.
Katakan satu utas memasukkan elemen ke dalam barisan dan satu lagi benang mengeluarkan unsur dari barisan.
Sekarang, jika utas pertama berjalan lebih perlahan, barisan penyekat dapat membuat utas kedua menunggu sehingga utas pertama menyelesaikan operasinya.