Beberapa cara untuk mengimplementasikan model produsen dan konsumen
Ambil contoh dalam hidup kita sebagai contoh. Produk yang diproduksi oleh pabrik selalu diekspor untuk digunakan di luar. Ini adalah konsep produksi dan konsumsi.
Dalam proses pengembangan perangkat lunak kami yang sebenarnya, kami sering menemukan skenario berikut: Modul bertanggung jawab untuk menghasilkan data, dan data ini diproses oleh modul lain (modul di sini digeneralisasi, yang dapat berupa kelas, fungsi, utas, proses, dll.).
Modul yang menghasilkan data dengan jelas disebut produsen; Sementara modul yang memproses data disebut konsumen.
Tipe Pertama: Gunakan Notify Wait untuk mengimplementasikan model produsen dan konsumen
1. Seorang produsen dan konsumen:
2. Satu produsen dan banyak konsumen:
Jenis kedua: Menggunakan antrian pemblokiran untuk mengimplementasikan model produsen dan konsumen
3. Gunakan antrian pemblokiran untuk mengimplementasikan pola konsumen produsen
Saya percaya semua orang telah pergi ke masakan Jepang. Ada makanan yang sangat menarik yang barbekyu. Guru barbekyu akan berdiri di samping dan terus memanggang, dan kemudian meletakkan daging panggang di atas piring; Dan kami pengunjung yang ngiler akan duduk di samping, dan kami akan terus makan selama ada daging di piring.
Dalam kasus kehidupan ini, master barbekyu adalah produser, dan dia bertanggung jawab atas barbekyu. Setelah memanggang, ia meletakkan daging di atas piring alih -alih menyerahkannya langsung ke restoran (yaitu, tidak perlu memberi tahu restoran untuk makan daging). Jika daging di atas piring penuh, master akan berhenti sebentar sampai seseorang pergi makan barbekyu sebelum memproduksi daging; Dan para pengunjung hanya menatap piring, dan begitu ada daging di atas piring, kami bertanggung jawab untuk memakannya;
Selama seluruh proses, pengunjung dan master barbekyu tidak saling berurusan secara langsung, tetapi berinteraksi dengan piring.
Piring bertindak sebagai konsep buffer. Jika ada sesuatu yang diproduksi, masukkan. Pelat juga memiliki batas ukuran. Jika melebihi ukuran pelat, itu akan memblokir produksi produsen dan menunggu konsumen mengkonsumsi; Ketika pelat kosong, itu akan memblokir konsumsi konsumen dan menunggu produsen memproduksi.
Memblokir antrian selama pemrograman dapat mewujudkan fungsi disk.
Karakteristik antrian pemblokiran:
Ketika elemen antrian penuh, blokir operasi penyisipan;
Ketika elemen antrian kosong, operasi akuisisi diblokir.
Baik ArrayBlockingQueue dan LinkedBlockingQueue mendukung FIFO (pertama, pertama, tetapi LinkedBlockingQueue tidak terbatas, sementara ArrayBlockingQueue dibatasi.
Berikut ini menggunakan antrian memblokir untuk mengimplementasikan produsen dan konsumen:
Produsen:
impor java.util.concurrent.blockingqueue; produser kelas publik mengimplementasikan runnable {private final blockingqueue blockingqueue; // Atur ukuran cache antrian. Produksi akan dihentikan sementara setelah melebihi ukuran ini selama proses produksi. Private final int queue_size = 10; produsen publik (blockingqueue blockingqueue) {this.blockingqueue = blockingqueue;} int tugas = 1; @override public void run () {while (true) {cobalah {system.out.println ("Produksi:"+Tugas);//Masukkan produk yang diproduksi di dalam {iP quue ("produksi:"+Tugas); // Masukkan produk yang diproduksi di dalam {{iT {i. Untuk sementara untuk memfasilitasi melihat efek thread.konsumen:
import java.util.concurrent.BlockingQueue;//Consumer public class Consumer implements Runnable{private final BlockingQueue blockingQueue;public Consumer(BlockingQueue blockingQueue){this.blockingQueue = blockingQueue;}@Override public void run() {//As long as there is a task in the blocking queue, it will continue to consume while(true){try {System.out.println ("Consuming:" + Blockingqueue.take ()); // Biarkan berhenti sebentar untuk memfasilitasi melihat efek thread.sleep (2000);} tangkap (interruptedException e) {e.printstacktrace ();}}}}}tes:
import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;/** * Producer consumer mode* Use blocking queue BlockingQueue * @author wanggenshen * */public class TestConPro {public static void main(String[] args){BlockingQueue blockingQueue = new LinkedBlockingQueue (5); Produser P = Produser Baru (BlockingQueue); konsumen C = konsumen baru (blockingqueue); thread tp = utas baru (p); utas tc = utas baru (c); tp.start (); tc.start ();}}Karena LinkedBlockingQueue adalah antrian yang tidak terikat, produsen akan terus memproduksi, menempatkan tugas yang diproduksi dalam antrian, dan konsumen akan mengkonsumsi dalam antrian:
Jika Anda menggunakan arrayblockingqueue antrian blocking terikat sebagai gantinya, Anda dapat menginisialisasi ukuran antrian. Kemudian ketika elemen -elemen dalam antrian melebihi ukuran antrian, produsen akan menunggu konsumen mengkonsumsi satu dan kemudian memproduksi yang lain:
Kode Uji:
Inisialisasi arrayblockingqueue ukuran 10:
public static void main (string [] args) {blockingqueue blockingqueue = arrayblockingqueue baru (10); produser p = produsen baru (blockingqueue); konsumen c = konsumen baru (blockingqueue); thread tp = utas baru (p); thread tc = utas baru (c); tp.start ();Selama tes, produsen diizinkan menghasilkan sedikit lebih cepat, sementara konsumen lebih lambat. Anda dapat melihat bahwa perbedaan antara nomor seri produk yang diproduksi dan nomor seri produk yang dikonsumsi selalu 10 (ukuran antrian):
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang metode implementasi model konsumen produksi dan contoh kode masalah keselamatan utas. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!