Java生産者と消費者の例_動力ノードJava学院の整理
生産者-消費者(producer-consumer)の問題は、境界バッファとも呼ばれる問題で、2つのプロセスは共通の固定サイズのバッファを共有します。その中の一つは生産者で、メッセージをバッファに入れるためです。もう一つは消費者で、バッファからメッセージを取り出すためです。問題が発生したのはバッファが満杯になりましたが、生産者が新たなデータを中に入れたい場合、その解決方法は生産者にこの時休眠させ、消費者がバッファから1つ以上のデータを取ってから呼び覚まします。同様に、バッファが空きました。消費者はまたメッセージを取りに行きたいです。この時も消費者を休眠させて、生産者が1つ以上のデータを入れるのを待ってから呼び覚ましてもいいです。
一、まず公共資源類を定義し、その中の変数numberは保存された公共データである。
また、2つの方法を定義し、numberの値を増加させ、numberの値を減少させる。マルチスレッドのためには、synchronizedキーを付けなければなりませんので、while判定の条件に注意してください。
Javaコード
二、それぞれ生産を定義する。
Javaコード
Javaコード
一、まず公共資源類を定義し、その中の変数numberは保存された公共データである。
また、2つの方法を定義し、numberの値を増加させ、numberの値を減少させる。マルチスレッドのためには、synchronizedキーを付けなければなりませんので、while判定の条件に注意してください。
Javaコード
二、それぞれ生産を定義する。
/**
*
*/
public class PublicResource {
private int number = 0;
/**
*
*/
public synchronized void increace() {
while (number != 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number++;
System.out.println(number);
notify();
}
/**
*
*/
public synchronized void decreace() {
while (number == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number--;
System.out.println(number);
notify();
}
}
スレッドと消費スレッドは、複数の生産と消費をシミュレートし、すなわち、公共資源のnumber値を増加し、減少させる。Javaコード
/**
* ,
*/
public class ProducerThread implements Runnable {
private PublicResource resource;
public ProducerThread(PublicResource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.increace();
}
}
}
/**
* ,
*/
public class ConsumerThread implements Runnable {
private PublicResource resource;
public ConsumerThread(PublicResource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.decreace();
}
}
}
第三に、複数の生産者と消費者が公共資源を操作する状況を模擬し、結果は許容範囲内であることを保証しなければならない。Javaコード
public class ProducerConsumerTest {
public static void main(String[] args) {
PublicResource resource = new PublicResource();
new Thread(new ProducerThread(resource)).start();
new Thread(new ConsumerThread(resource)).start();
new Thread(new ProducerThread(resource)).start();
new Thread(new ConsumerThread(resource)).start();
new Thread(new ProducerThread(resource)).start();
new Thread(new ConsumerThread(resource)).start();
}
}
以上のように、Java生産者と消費者の例を紹介しました。皆さんに何かご質問があれば、メッセージをください。編集者はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。