マルチスレッド-プロデューサーコンシューマー問題-中間進化07
分析
これはスレッドの同期の問題です。プロデューサーとコンシューマーはリソースを共有し、プロデューサーとコンシューマーは互いに依存しています。
生産者は、製品を生産する前に待つように消費者に通知し、生産後に消費するように消費者に通知するものとします。
消費者が消費した後、生産者は消費が終了し、生産が必要であることを通知されます
スレッド通信
Javaは通信の問題を解決するいくつかの方法を提供します
メソッド名 | 効果 |
---|---|
待つ() | スレッドが待機していて、他のスレッドに通知されることを知っていることを示します。スリープとは異なり、ロックは解放されます |
待機(長いタイムアウト) | 待機するミリ秒数を指定します |
notify() | 待機状態のスレッドを起こす |
notifyAll() | 同じオブジェクトでwait()メソッドを呼び出すすべてのスレッドを起動し、優先度の高いスレッドが最初にスケジュールされます |
注:Objectクラスのすべてのメソッドは、同期メソッドまたは同期コードブロックでのみ使用できます。それ以外の場合は、例外がスローされますIllegalMonitorStateException
ソリューション1-管理方法
並行コラボレーションモジュール
プロデューサー:生産データを担当
消費者:データの処理を担当
バッファー:消費者はプロデューサーデータを直接使用できません。バッファーがあります。
プロデューサは生成されたデータをバッファに入れ、コンシューマはバッファ内のデータを消費します
package com.example.thread;
//测试:生产者消费者模型-》利用缓冲区解决:管程法
//生产者,消费者,产品,缓冲区
public class TestPC {
public static void main(String[] args) {
Buffer buffer = new Buffer();
new Producer(buffer).start();
new Consumer(buffer).start();
}
}
class Producer extends Thread{
Buffer buffer;
public Producer(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("produce"+i);
try {
buffer.push(new Product(i));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer extends Thread{
Buffer buffer;
public Consumer(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("consumer"+buffer.pop().id);
}
}
}
class Product{
int id;
public Product(int id) {
this.id = id;
}
}
class Buffer{
//需要一个容器大小
Product[] products = new Product[10];
int count =0;
public synchronized void push(Product product) throws InterruptedException {
//如果容器满了,等待消费者消费
if (count == products.length) {
//通知消费者消费
this.wait();
}
//如果容器没有满,需要丢入产品
products[count] =product;
count++;
this.notifyAll();
}
public synchronized Product pop() {
//如果容器空,等待
if (count == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果容器非空,消费
count--;
Product product = products[count];
this.notifyAll();
return product;
}
}
ソリューション2-セマフォメソッド
並行コラボレーションモデル
判定フラグ
package com.example.thread;
public class TestPC02 {
public static void main(String[] args) {
TV tv = new TV();
new Actors(tv).start();
new Watcher(tv).start();
}
}
class Actors extends Thread{
TV tv;
public Actors(TV tv) {
this.tv = tv;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if (i % 2 == 0) {
this.tv.play("tictok");
} else {
this.tv.play("康熙");
}
}
}
}
class Watcher extends Thread {
TV tv;
public Watcher(TV tv) {
this.tv = tv;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
this.tv.watch();
}
}
}
class TV{
String voice;
boolean flag = true;
public synchronized void play(String voice) {
if (!flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("lalala~~");
this.notifyAll();
this.voice = voice;
this.flag = !this.flag;
}
public synchronized void watch() {
if (flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("wow~~");
this.notifyAll();
this.flag = !this.flag;
}
}