マルチスレッド-プロデューサーコンシューマー問題-中間進化07

マルチスレッド-プロデューサーコンシューマー問題-中間進化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;
    }
}

おすすめ

転載: blog.csdn.net/rr18758236029/article/details/108587460