Copy kode kodenya sebagai berikut:
kondisi paket;
impor java.util.ArrayList;
impor java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Gunakan Kunci dan Kondisi untuk menerapkan model produsen-konsumen
* @penulis akan
*
*/
kelas publik ProducerConsumerDemo {
public static void main(String[] args) {
int jumlah produser = 10;
int jumlah konsumen = 15;
final ProducerConsumerDemo pcd = new ProducerConsumerDemo(5); // Ukuran buffer adalah 5
Thread[] producerThreads = Thread baru[producerCount];
untuk(int i = 0; i < jumlah produser; i++) {
producerThreads[i] = new Thread("produser" + (i+1)) {
@Mengesampingkan
menjalankan kekosongan publik() {
pcd.produksi();
}
};
}
Thread[] ConsumerThreads = Thread baru[ConsumerCount];
untuk(int j = 0; j < Jumlah konsumen; j++) {
benang konsumen[j] = Benang baru("konsumen" + (j+1)) {
@Mengesampingkan
menjalankan kekosongan publik() {
pcd.konsumsi();
}
};
}
//Mulai thread produsen konsumen
untuk(int i = 0; i < jumlah produser; i++) {
produserThreads[i].start();
}
untuk(int j = 0; j < Jumlah konsumen; j++) {
benang konsumen[j].mulai();
}
}
int akhir statis pribadi DEFAULT_BUFFER_SIZE = 10;
private int bufferSize; // ukuran buffer
Daftar pribadi<Objek> bufferList;
kunci kunci akhir pribadi = new ReentrantLock (benar);
kondisi akhir pribadi kondisi = lock.newCondition();
publik ProducerConsumerDemo(int bufferSize) {
this.bufferSize = bufferSize > 0 ? bufferSize : DEFAULT_BUFFER_SIZE;
bufferList = Daftar Array baru<Objek>(bufferSize);
}
// Produksi
kekosongan publik menghasilkan() {
kunci.kunci(); // kunci
mencoba {
while(bufferList.size() == bufferSize) {// Buffer sudah penuh
System.out.println("Produser tunggu, thread: " + Thread.currentThread().getName());
kondisi.menunggu();
}
// Produksi
bufferList.add(Objek baru());
System.out.println("Produser memproduksi satu, sekarang ukuran buffer: "
+ bufferList.size() + ", dan utas: " + Thread.currentThread().getName());
condition.signalAll(); // Beritahu konsumen
} tangkapan(InterruptedException e) {
e.printStackTrace();
} Akhirnya {
mengunci.membuka();
}
}
// Konsumsi
konsumsi kekosongan publik() {
kunci.kunci(); // kunci
mencoba {
while(bufferList.isEmpty()) {// Buffer kosong
System.out.println("Konsumen menunggu, thread: " + Thread.currentThread().getName());
kondisi.menunggu();
}
// Konsumsi
bufferList.remove(0); // Hapus satu dari kepala daftar tertaut
System.out.println("Konsumen satu, sekarang ukuran buffer: "
+ bufferList.size() + ", dan utas: " + Thread.currentThread().getName());
kondisi.sinyalSemua();
} tangkapan(InterruptedException e) {
e.printStackTrace();
} Akhirnya {
mengunci.membuka();
}
}
}