Jika BlockingQueue penuh, operasi apa pun yang berupaya menyimpan barang -barang di dalamnya akan diblokir dan tidak akan terbangun untuk melanjutkan operasi sampai ada ruang baru dalam blockingqueue.
Metode utama yang disediakan oleh BlockingQueue adalah:
Tambahkan (Anobject): Tambahkan Anobject ke BlockingQueue.
Tawaran (Anobject): Tambahkan anobject ke blockingqueue.
letakkan (anobject): Tambahkan anobject ke blockingqueue.
Polling (Time): Keluarkan objek yang diperingkat terlebih dahulu di BlockingQueue. Kembali nol saat tidak dapat diambil.
Take (): Ambil objek yang diperingkat terlebih dahulu di BlockingQueue.
Ada 4 implementasi spesifik BlockingQueue sesuai dengan kebutuhan yang berbeda:
(1) ArrayBlockingQueue: Konstruktor dari ukuran yang ditentukan harus memiliki parameter int untuk menunjukkan ukurannya. Objek yang dikandungnya diurutkan dalam urutan FIFO (pertama, keluar pertama).
(2) LinkedBlockingQueue: BlockingQueue dengan ukuran yang bervariasi.
Jika parameter ukuran tidak termasuk, ukuran blockingqueue yang dihasilkan ditentukan oleh integer.max_value. Objek yang dikandungnya diurutkan dalam urutan FIFO (pertama, keluar pertama).
Dibandingkan dengan LinkedBlockingQueue dan ArrayBlockingQueue, struktur data yang digunakan di belakangnya berbeda.
Throughput data LinkedBlockingQueue lebih besar dari arrayblockingqueue, tetapi prediktabilitas kinerjanya lebih rendah daripada arrayblockingqueue ketika jumlah utasnya besar.
(3) PriorityBlockingQueue: Mirip dengan LinkedBlockingQueue, tetapi penyortiran objek yang dikandungnya bukan FIFO, tetapi ditentukan oleh urutan penyortiran alami objek atau urutan yang ditentukan oleh pembanding yang dibawa oleh konstruktor.
(4) Synchronousqueue: Blockingqueue khusus, pengoperasiannya harus diselesaikan secara bergantian dengan meletakkan dan mengambil.
Salinan kode adalah sebagai berikut:
paket com.yao;
impor java.util.concurrent.arrayblockingqueue;
impor java.util.concurrent.blockingqueue;
impor java.util.concurrent.executorservice;
impor java.util.concurrent.Executors;
BlockingqueueTest kelas publik {
/**
Mendefinisikan keranjang untuk apel
*/
keranjang kelas statis publik {
// keranjang, dapat menampung 3 apel
Blockingqueue <string> keranjang = arrayblockingqueue baru <string> (3);
// menghasilkan apel dan memasukkannya ke dalam keranjang
public void produce () melempar InterruptedException {
// Masukkan apel di metode put.
keranjang.put ("sebuah apel");
}
// mengkonsumsi apel dan mengeluarkannya dari keranjang
Public String Consume () melempar InterruptedException {
// Dapatkan metode mengeluarkan apel.
String apple = keranjang.take ();
mengembalikan apel;
}
public int getAppLeNumber () {
return keranjang.size ();
}
}
// Metode uji
public static void testBasket () {
// Bangun keranjang dengan apel
keranjang final keranjang = keranjang baru ();
// Tentukan produser apel
Produser kelas mengimplementasikan runnable {
public void run () {
mencoba {
while (true) {
// memproduksi apel
System.out.println ("Produser siap menghasilkan apel:"
+ System.currentTimemillis ());
keranjang.produce ();
System.out.println ("Produser telah selesai memproduksi apel:"
+ System.currentTimemillis ());
System.out.println ("Setelah produksi, ada apel:"+keranjang.getapplenumber ()+");
// 300ms tidur
Thread.sleep (300);
}
} catch (InterruptedException ex) {
}
}
}
// Tentukan konsumen apel
Kelas konsumen mengimplementasikan runnable {
public void run () {
mencoba {
while (true) {
// konsumsi apel
System.out.println ("Konsumen siap untuk mengkonsumsi Apple:"
+ System.currentTimemillis ());
keranjang.consume ();
System.out.println ("Konsumen mengkonsumsi apel"
+ System.currentTimemillis ());
System.out.println ("Setelah konsumsi, ada apel:"+keranjang.getapplenumber ()+");
// 1000ms tidur
Thread.sleep (1000);
}
} catch (InterruptedException ex) {
}
}
}
Layanan ExecutorService = Executors.NewCachedThreadPool ();
Produser produser = produser baru ();
Konsumen konsumen = konsumen baru ();
service.submit (produser);
service.submit (konsumen);
// Setelah program berjalan selama 10 detik, semua tugas akan dihentikan
mencoba {
Thread.sleep (10000);
} catch (InterruptedException e) {
}
service.shutdownnow ();
}
public static void main (string [] args) {
Blockingqueuetest.testbasket ();
}
}