Simulasi masalah klasik produsen-konsumen. Program ini mensimulasikan kasus paling sederhana - buffering tunggal. Untuk mensimulasikan situasi sebenarnya, penundaan ditambahkan saat mengonsumsi item dan memproduksi item. Anda dapat mensimulasikan tingkat pembangkitan dan konsumsi yang berbeda dengan memodifikasi penundaan.
[kode]
[/bersama/**
* Masalah konsumen-produsen penyangga tunggal.
* oleh xu(xusiwei1236@163.com).
* */
Produsen Konsumen kelas publik {
buffer Objek statis = null;
Objek statis mutex = Objek baru();
Objek statis condConsumer = Objek baru();
Objek statis condProducer = Objek baru();
public static void main(String[] args) {
Produser thread = Thread baru() {
menjalankan kekosongan publik() {
//untuk(int i=0; i<10; i++) {
untuk(int i=0; ; i++) {
// menghasilkan barang.
mencoba {
Thread.tidur(1000);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
String item = string baru("item-" + i);
System.out.println("[produsen] memproduksi " + item);
// menunggu buffer kosong.
disinkronkan (condProducer) {
sementara(penyangga != nol) {
mencoba {
condProducer.tunggu();
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
}
}
// letakkan item ke buffer.
disinkronkan (mutex) {
penyangga = barang;
System.out.println("[produser] masukkan " + item + " ke buffer.");
}
// beri tahu konsumen.
disinkronkan (condConsumer) {
condConsumer.notify();
}
}
}
};
Konsumen thread = Thread baru() {
menjalankan kekosongan publik() {
//untuk(int i=0; i<10; i++) {
untuk( ; ; ) {
// menunggu barang datang.
disinkronkan (condConsumer) {
sementara( penyangga == null ) {
mencoba {
condConsumer.tunggu();
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
}
}
// ambil item dari buffer.
Item string = nol;
disinkronkan (mutex) {
item = (String)penyangga;
penyangga = nol;
System.out.println("[konsumen] dapatkan " + item + " dari buffer.");
}
// mengkonsumsi item.
mencoba {
Thread.tidur(500);
} tangkapan (InterruptedException e) {
e.printStackTrace();
}
System.out.println("[konsumen] dikonsumsi " + item);
// beri tahu produser.
disinkronkan (condProducer) {
condProducer.notify();
}
}
}
};
konsumen.mulai();
produser.mulai();
}
}de]