Apa itu BlockingQueue di Java dan bagaimana menerapkannya?



Artikel ini mengenai BlockingQueue di Java akan membantu anda mempelajari tentang antara muka BlockingQueue. Ini juga akan memberi anda gambaran mengenai kaedah dan pelaksanaannya yang praktikal

sangat popular di kalangan pengaturcara kerana pelbagai ciri bawaannya yang lengkap. Sebilangan besar masa anda akan mempunyai penyelesaian khusus untuk masalah anda bahkan sebelum ia muncul. Bahagian yang sangat berguna dan penting adalah antara muka BlockingQueue di Java. Melalui media artikel ini, saya akan memberi penerangan mengenai BlockingQueue di Java dan kaedah untuk melaksanakannya.

Berikut adalah topik yang dibahas dalam artikel ini:





Antaramuka BlockingQueue di Java

BlockingQueue di Java adalah antara muka yang ditambahkan di Java 1.5 bersama dengan beberapa kelas Utiliti serentak lain seperti ConcurrentHashMap, CopyOnWriteArrrayList, dll. Antara muka BlockingQueue adalah milik java.util.concurrent pakej .Antaramuka ini meningkatkan kawalan aliran dengan mengaktifkan pemblokiran, sekiranya benang sedang berusaha untuk mengundurkan barisan kosong atau mengisikan barisan penuh. Dalam kedua-dua keadaan, antara muka ini sangat berguna.Dalam istilah yang lebih sederhana, anggaplah a sedang berusaha menambahkan elemen ke dalam barisan yang sudah penuh. Pada tahap ini dalam program, BlockingQueue akan dipanggil yang akan menyekat utas tertentu sehingga thread lain melepaskan barisan untuk memberi ruang. Ini boleh menjadi akibat daripada pengurangan unsur pelepasan keseluruhan barisan. Begitu juga, BlockingQueue akan dipanggil untuk menyekat utas yang cuba menguraikan antrian yang sudah kosong sehingga beberapa utas lain memasukkan atau menambahkan elemen ke dalam kosong beratur .

Semasa bekerja dengan antara muka BlockingQueue di Java, anda mesti ingat bahawa ia tidak menerima nilai nol. Sekiranya anda mencuba melakukannya, ia akan membuang NullPointerException dengan serta-merta. Gambar di bawah menunjukkan cara kerja antara muka BlockingQueue di Java.



BlockingQueue - BlockingQueue di Java - EdurekaIni antara muka digunakan terutamanya di antara Pengeluar-Pengguna kerana ia Selamat di Thread.Maksud saya ialah antara muka BlockingQueue dapat digunakan untuk membuat barisan yang dapat dikongsi oleh pengeluar dan pengguna

Untuk bekerja dengan BlockingQueue di Java, pertama, anda perlu membiasakan jenisnya. Izinkan saya memperkenalkan anda kepada mereka di bahagian seterusnya dari artikel ini.

Jenis Pembina untuk BlockingQueue di Java

Terdapat dua jenis konstruktor untuk antara muka BlockingQueue di Java:



cara menggunakan tostring di java
  • Baris Tidak Terhad: Untuk barisan jenis ini, kapasiti akan ditetapkan ke Integer.MAX_VALUE. Antrian yang tidak terikat tidak akan dapat disekat kerana dapat tumbuh secara dinamik, setiap kali elemen dimasukkan ke dalamnya. Berikut adalah sintaks untuk membuat barisan tanpa had:
BlockingQueue bq = LinkedBlockingDeque baru ()
  • Baris Terhad: Untuk barisan seperti ini, anda perlu meluangkan kapasiti barisan pada saat penciptaannya sebagai pembina parameter. Setelah ukuran ditetapkan, ia tidak dapat diubah. Berikut adalah sintaks untuk membuat barisan terikat:
BlockingQueue bq = LinkedBlockingDeque baru (10)

Sekarang anda sudah biasa dengan cara untuk menerapkan BlockingQueue di Java, izinkan saya menyenaraikan beberapa kaedahnya.

Kaedah dalam Antaramuka BlockingQueue

Kaedah Penerangan
tambah boolean (E e) Kaedah ini membantu memasukkan elemen yang ditentukan ke dalam barisan ini jika ada ruang di dalam barisan yang lainmembuang sebuahPengecualianStateElegal
boolean mengandungi (Objek o) Kaedah ini kembali benar sekiranya barisan mengandungi elemen yang ditentukan
int drainTo (Koleksi c) Kaedah ini akan membuang semua elemen yang ada dari barisan dan menambahkannya ke koleksi yang ditentukan
int drainTo (Koleksi c, int maxElements) Kaedah ini akan mengeluarkan sejumlah elemen yang ada dari barisan dan menambahkannya ke dalam yang ditentukan
tawaran booloean (E e) Kaedah ini akan memasukkan elemen yang ditentukan ke dalam barisan jika tidak penuh dan kembali benar, jika tidak, ia akan kembali palsu
tawaran boolean (E, jangka masa panjang, unit TimeUnit) Kaedah ini akan memasukkan elemen yang ditentukan ke dalam barisan. Sekiranya barisan penuh, ia akan menunggu sehingga masa menunggu yang ditentukan sehingga ruang tersedia.
E poll (timeout panjang, unit TimeUnit) Kaedah ini membantu dalam mendapatkan dan mengeluarkan kepala barisan. Sekiranya barisan kosong, ia akan menunggu sehingga masa menunggu yang ditentukan sehingga elemen tersedia
pasang kosong (E e) Kaedah ini akan memasukkan elemen yang ditentukan ke dalam barisan dengan menunggu ruang tersedia sekiranya masalahnya penuh
baki kapasiti () Kaedah ini membantu mengembalikan bilangan elemen tambahan yang dapat diterima oleh barisan ini dengan ideal tanpa disekat
boolean remove (Objek o) Kaedah ini akan mengeluarkan satu contoh elemen yang ditentukan dari barisan hanya jika ada
E ambil () Kaedah ini akan membantu dalam mengambil dan mengeluarkan kepala barisan dengan menunggu elemen tersedia, sekiranya barisan kosong.

Pelaksanaan BlockingQueue

Di sini saya akan melaksanakan contoh ringkas BlockingQueue di Java di manakelas EduProducer akan menghasilkan data dan memasukkannya ke dalam a beratur , secara serentak, kelas lain, EduConsumer akan mengeluarkan data dari barisan yang sama.

Untuk ini saya akan membuat 3 kelas iaitu:

  1. EduProducer
  2. EduConsumer
  3. EdurekaMain

Mari buat setiap kelas ini satu persatu.

EduProducer.java

pakej edureka import java.util.concurrent.BlockingQueue kelas awam EduProducer mengimplementasikan Runnable {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptException e) {Thread.currentThread (). interrupt ()} } proses kekosongan peribadi () membuang InterruptException {// Masukkan 10 int ke dalam Antrian untuk (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

pakej edureka import java.util.concurrent.BlockingQueue public class EduConsumer melaksanakan Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} tangkapan (InterruptException e) {Thread.currentThread (). Interrupt ()}} proses kekosongan peribadi (Integer take) membuang InterruptException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} awam EduConsumer (barisan BlockingQueue) {this.queue = queue}}

EdurekaMain.java

pakej edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) Thread baru (EduProducer baru) .start () Thread baru (EduConsumer baru (beratur)). mulakan ()}}

Setelah selesai menulis kod, jalankan program untuk mendapatkan output di bawah:

[Producer] Add: 0 [Consumer] Take: 0 [Producer] Queue's Sisa Kapasiti: 9 [Producer] Add: 1 [Producer] Queue's Sisa Kapasiti: 9 [Producer] Add: 2 [Producer] Queue's Sisa Kapasiti: 8 [Producer ] Tambah: 3 [Producer] Kapasiti Sisa Antrian: 7 [Pengguna] Ambil: 1 [Producer] Tambah: 4 [Producer] Kapasiti Sisa Antrian: 7 [Producer] Tambah: 5 [Producer] Kapasiti Sisa Queue: 6 [Producer] Tambah : 6 [Producer] Kapasiti Sisa Antrian: 5 [Pengguna] Ambil: 2 [Producer] Tambah: 7 [Producer] Kapasiti Sisa Antrian: 5 [Producer] Tambah: 8 [Producer] Kapasiti Sisa Queue: 4 [Producer] Tambah: 9 [Producer] Kapasiti Sisa Antrian: 3 [Consumer] Take: 3 [Consumer] Take: 4 [Consumer] Take: 5 [Consumer] Take: 6 [Consumer] Take: 7 [Consumer] Take: 8 [Consumer] Take: 9

Ini membawa kita ke akhir artikel ini mengenai BlockingQueue di Java. Sekiranya anda ingin mempelajari Java dengan lebih terperinci, anda boleh merujuk kepada kami juga.

Sekarang setelah anda memahami asas-asas BlockingQueue di Java, lihat oleh Edureka, sebuah syarikat pembelajaran dalam talian yang dipercayai dengan rangkaian lebih daripada 250,000 pelajar berpuas hati yang tersebar di seluruh dunia. Kursus Latihan dan Persijilan Java J2EE dan SOA Edureka dirancang untuk pelajar dan profesional yang ingin menjadi Pembangun Java. Kursus ini dirancang untuk memberi Anda awal dalam Pemrograman Java dan melatih anda untuk konsep Java teras dan maju bersama dengan pelbagai kerangka kerja Java seperti Hibernate & Spring.

Ada soalan untuk kami? Sila sebutkan di bahagian komen 'BlockingQueue in Java' ini dan kami akan menghubungi anda secepat mungkin.