1. Konsep
Masalah produsen dan konsumen adalah masalah kolaborasi multi-threaded di Jindian. Produsen bertanggung jawab untuk memproduksi produk dan menyimpannya di gudang; Konsumen mendapatkan produk dari gudang dan mengkonsumsinya. Ketika gudang penuh, produser harus menghentikan produksi sampai ada lokasi untuk produk yang akan disimpan; Ketika gudang kosong, konsumen harus menghentikan konsumsi sampai ada produk di gudang.
Teknik -teknik berikut terutama digunakan untuk menyelesaikan masalah produsen/konsumen: 1. Gunakan utas untuk mensimulasikan produsen dan terus -menerus menyimpan produk di gudang dalam metode run. 2. Gunakan utas untuk mensimulasikan konsumen dan terus -menerus mendapatkan produk dari gudang dalam metode run. 3
The . Kelas gudang menyimpan produk. Ketika jumlah produk adalah 0, metode tunggu dipanggil, menyebabkan utas konsumen saat ini memasuki keadaan menunggu. Ketika produk baru disimpan, metode pemberitahuan dipanggil untuk membangunkan utas konsumen yang menunggu. Ketika gudang penuh, metode tunggu dipanggil, menyebabkan utas produser saat ini memasuki keadaan menunggu. Ketika seorang konsumen mendapatkan produk, metode pemberitahuan dipanggil untuk membangunkan utas produsen yang menunggu.
2. Contoh
Paket Book.thread.product; Kelas Publik Konsumen Memperluas Thread {Private Warehouse Warehouse; // The Warehouse Di mana Konsumen Mendapatkan Produk Private Boolean Running = False; // Adalah bendera bendera dari utas akhir yang diperlukan konsumen publik (gudang gudang, nama string) {super (nama); this.warehouse = gudang; } public void start () {this.running = true; super.start (); } public void run () {Produk Produk; coba {while (running) {// dapatkan produk dari produk gudang = warehouse.getProduct (); tidur (500); }} catch (InterruptedException e) {E.PrintStackTrace (); }} // Hentikan utas konsumen public void stopconsumer () {disinkronkan (gudang) {this.running = false; warehouse.notifyall (); // beri tahu utas menunggu gudang}} // apakah utas konsumen menjalankan public boolean isRunning () {return running; }} package book.thread.product;public class Producer extends Thread{ private Warehouse warehouse;//The manufacturer stores the product's warehouse private static int produceName = 0;//The product's name private boolean running = false;//The flag bit of the end thread is required public Producer(Warehouse warehouse,String name){ super(name); this.warehouse = gudang; } public void start () {this.running = true; super.start (); } public void run () {Produk Produk; // memproduksi dan menyimpan produk coba {while (running) {product = produk baru ((++ produkName)+""); this.warehouse.storageProduct (produk); tidur (300); }} catch (InterruptedException e) {E.PrintStackTrace (); }} // Hentikan utas produser public void stopProducer () {disinkronkan (gudang) {this.running = false; // beri tahu utas menunggu gudang gudang gudang gudang.notifyall (); }} // Apakah utas produser menjalankan public boolean isRunning () {return running; }} paket book.thread.product; produk kelas publik {name string pribadi; // nama produk produk publik (nama string) {this.name = name; } public String toString () {return "Product-"+name; }} paket buku.thread.product; // Kelas gudang produk menggunakan array untuk mewakili antrian melingkar untuk menyimpan produk gudang kelas publik {private static int kapasitas = 11; // kapasitas produk private private hare warehouse; private int rete = 0; // Subskrip produk terakhir yang tidak dikonsumsi di gudang ditambah 1 warehouse publik () {this.products = produk baru [kapasitas]; } gudang publik (kapasitas int) {this (); if (kapasitas> 0) {kapasitas = kapasitas +1; this.products = produk baru [kapasitas]; }} // Dapatkan produk dari gudang produk publik GetProduct () melempar interruptException {disinkronkan (this) {boolean consumerrunning = true; // tag apakah utas konsumen masih menjalankan utas currentthread = thread.currentThread (); // dapatkan thread if Current (Currentthread) {consumer) {consumer (); } else {return null; // bukan konsumen dapat memperoleh produk} // Jika utas konsumen sedang berjalan, tetapi tidak ada produk di gudang, utas konsumen terus menunggu sementara ((depan == belakang) && consumerrunning) {tunggu (); consumerrunning = (konsumen) currentthread) .isrunning (); } // Jika utas konsumen telah berhenti berjalan, keluarlah metode dan membatalkan produk jika (! ConsumerRunning) {return null; } // Dapatkan produk pertama yang belum dikonsumsi pada produk produk saat ini = produk [depan]; System.out.println ("Konsumen ["+currentThread.getName ()+"] GetProduct:"+Produk); // Pindahkan subskrip dari produk yang saat ini tidak dikonsumsi satu per satu, jika mencapai ujung array, pindah ke header depan = (depan+1+kapasitas)%kapasitas; System.out.println ("Jumlah produk yang belum dikonsumsi di gudang:"+(belakang+kapasitas-front)%kapasitas); // beri tahu utas menunggu lainnya notify (); produk pengembalian; }} // Menyimpan produk ke gudang public void storeGeproduct (produk produk) melempar InterruptedException {disinkronkan (ini) {boolean produceRrunning = true; // Tandatangani apakah utas produser menjalankan utas saat ini = thread.currentThread (); if (instal currentthread dari produser) {producerRunning = ((produser) currentThread) .isrunning (); } else {return; } // Jika produk yang tidak dikonsumsi terakhir berada di sebelah subskrip produk yang tidak dikonsumsi pertama, itu berarti tidak ada ruang penyimpanan. // Jika tidak ada ruang penyimpanan dan utas produser masih berjalan, utas produser menunggu gudang untuk melepaskan produk sementara (((belakang+1)%kapasitas == depan) && produserRunning) {tunggu (); produceRrunning = ((produser) currentThread) .isrunning (); } // Jika utas produksi telah berhenti berjalan, penyimpanan produk dihentikan jika (! ProduserRunning) {return; } // Simpan produk ke produk gudang [belakang] = produk; System.out.println ("Produser [" + Thread.CurrentThread (). GetName () + "] StorageProduct:" + Produk); // Ubah subskrip belakang satu demi satu. Belakang = (belakang + 1)%kapasitas; System.out.println ("Jumlah produk yang tidak dikonsumsi di gudang:" + (belakang + kapasitas -front)%kapasitas); memberitahu(); }}} paket buku.thread.product; Public Class TestProduct {public static void main (string [] args) {gudang gudang = gudang baru (10); // Buat gudang dengan kapasitas 10 // Buat utas produser dan produser konsumen1 = produser baru (warehouse, "produser-1); Produser produser2 = produser baru (gudang, "produser-2"); Produser produser3 = produser baru (gudang, "produser-3"); Konsumen konsumen1 = konsumen baru (gudang, "konsumen-1"); Konsumen konsumen2 = konsumen baru (gudang, "konsumen-2"); Konsumen konsumen3 = konsumen baru (gudang, "konsumen-3"); Konsumen konsumen4 = konsumen baru (gudang, "konsumen-4"); // Mulai utas produsen dan utas konsumen memproduksi1.start (); produser2.start (); konsumen1.start (); produser3.start (); konsumen2.start (); konsumen3.start (); konsumen4.start (); // Biarkan program produser/konsumen berjalan untuk 1600ms coba {thread.sleep (1600); } catch (InterruptedException e) {E.PrintStackTrace (); } // hentikan utas konsumen memproduksi1.stopproducer (); konsumen1.stopconsumer (); produser2.stopproducer (); konsumen2.stopconsumer (); produsen3.stopproducer (); konsumen3.stopconsumer (); konsumen4.stopconsumer (); }}Hasil output:
Producter [Productter-1] StorageProduct: Jumlah produk yang belum dikonsumsi di gudang produk-1: 1Consumer [konsumen-2] GetProduct: Jumlah produk yang belum dikonsumsi di produk-1 produk: Produce-2-producer [Produce-3] Storageproduct: Jumlah produk yang belum dikonsumsi di The Consumed in the Producte-3-Produce-3 StorageProduct: Jumlah produk yang belum dikonsumsi di gudang produk-2: 2consumer [konsumen-3] GetProduct: Jumlah produk yang belum dikonsumsi di produk-3 gudang: 1Consumer yang tidak ada produk: Jumlah Produse-Product yang belum dikonsumsi di Produk-2: 0product Product: Jumlah produk yang belum dikonsumsi di The Product-2 Gudang: 0proded: 0product: Jumlah produk yang belum dikonsumsi di The Product-2 Warehouse: 0Product Product: Jumlah Produk yang belum dikonsumsi di The Product-2 Warehouse: 0proding: 0product: The ProduceP-Producte yang belum dikonsumsi di The Product-2 Warehouse: 0prody Product: The Producte yang belum dikonsums Dikonsumsi di gudang produk-4: 1Consumer [konsumen-4] GetProduct: Jumlah produk yang belum dikonsumsi di produk-4 gudang: 0producer [Productter-3] StorageProduct: Jumlah Produk yang belum dikonsumsi di Nomor Produk-6 THE COMPODEP: 1 NOMEREPER: 1 PRODUCTEP: NOMERPOUS PRODUK: 1 NOMEREP PRODUK: NOMERPOUD-1 NOMEREP LOUTEP: 1-PRODUCER [MODUPTER-2 PRODUK That NOT NOMERPET: 1 NOMERPOUD LOUTEP: 1 NOBERPODE PRODUK: 1 NOBERPURED: 1-produkser [MUCACTER-200 warehouse: 2Consumer[consumer-1] getProduct: The number of products that have not been consumed in the Product-6 warehouse: 1Consumer[consumer-2] getProduct: The number of products that have not been consumed in the Product-5 warehouse: 0Producer[productr-1] storageProduct: The number of products that have not been consumed in the Product-7 warehouse: 1Consumer [konsumen-3] GetProduct: Jumlah produk yang belum dikonsumsi di gudang produk-7: 0Producer [Product-3] StorageProduct: Jumlah produk yang belum dikonsumsi di produk-2-produk yang tidak dikonsumsi. GetProduct: Produk-8 Jumlah produk yang belum dikonsumsi di gudang: 1-produser [Product-1] StorageProduct: Produk-10 Jumlah Produk yang belum dikonsumsi di gudang: 2 Producer [Product-3 StorageProduct: Produce-1 Jumlah produk yang belum dikonsumsi di gudang-2-produk: 3-produk: Produse-1 Produce-1 Product yang belum dikonsumsi di gudang: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk: 3 produk-2 ProduceP-2 Belum dikonsumsi di gudang: 4Consumer [konsumen-1] GetProduct: Produk-9 Jumlah produk yang belum dikonsumsi di gudang: 3Consumer [konsumen-2] GetProduct: Produk-10 Jumlah Produk yang belum dikonsumsi di gudang: 2 nome dari Consumer [Consumer-3] GetProduct: Produch-Prodouse-ProdUse yang tidak ada produk: Consumer-Consumer-3-Product: Produch-produk-produk-1 1Producer[productr-3] storageProduct:Product-13 Number of products that have not been consumed in the warehouse: 2Producer[productr-1] storageProduct:Product-14 Number of products that have not been consumed in the warehouse: 3Producer[producer-2] storageProduct:Product-15 Number of products that have not been consumed in the warehouse: 4Consumer[consumer-4] GetProduct: Produk-12 Jumlah produk yang belum dikonsumsi di gudang: 3consumer [konsumen-1] GetProduct: Produk-13 Jumlah produk yang belum dikonsumsi di gudang: 2Consumer [konsumen-2 yang belum ada produk-produk: produk-14 produk yang belum dikonsumsi di dalam gudang: 1 produk (1 produk-produk-14) yang belum dikonsumsi di dalam gudang: 1-produk (1 produk-produk-14. Di gudang: 2Producer [produser-3] StorageProduct: Jumlah produk yang belum dikonsumsi di gudang produk-17: 3Producer [Product-2] StorageProduct: Jumlah produk yang belum dikonsumsi di gudang produk-18: 4: 4
Analisis: Gudang produk didirikan dalam metode utama, dan gudang tidak mengaitkan 3 utas produsen dan 4 utas konsumen. Utas ini mulai membuat model produser/konsumen berfungsi. Ketika program berjalan selama 1600ms, semua produsen berhenti memproduksi produk dan konsumen berhenti mengonsumsi produk.
Produk utas produser memproduksi produk tanpa 300ms dalam metode run dan menyimpannya di gudang; Konsumen konsumen konsumen mengambil produk dari gudang tanpa 500ms dalam metode lari.
Gudang bertanggung jawab untuk menyimpan dan mendistribusikan produk. Metode StorageProduct bertanggung jawab untuk menyimpan produk. Ketika gudang penuh, utas saat ini memasuki keadaan menunggu, yaitu, jika produsernya memanggil metode StorageProduct untuk menyimpan produk, ia menemukan bahwa gudang penuh dan tidak dapat disimpan, itu akan memasuki keadaan menunggu. Ketika produk penyimpanan berhasil, metode pemberitahuan dipanggil untuk membangunkan utas konsumen yang menunggu.
Metode GetProduct bertanggung jawab atas produk tersebut terlebih dahulu. Saat gudang kosong, utas saat ini memasuki keadaan menunggu. Artinya, jika Consumer Thread B memanggil metode GetProduct untuk mendapatkan produk, ia menemukan bahwa gudang kosong, itu akan memasuki keadaan menunggu. Ketika produk berhasil diekstraksi, metode pemberitahuan dipanggil untuk membangunkan utas produser yang menunggu.
Artikel di atas secara singkat membahas masalah produsen dan konsumen di utas Java adalah semua konten yang saya bagikan dengan Anda. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.