Semaphoreを使用してマルチプロデューサー/マルチコンシューマーモードを実現---プロジェクトで柔軟な請求書を使用しました

この関数を使用する実際のシナリオは次のとおりです。当社には、シミュレートされた請求書を生成するモジュールがあります。シミュレートされた請求書には2つのシナリオがあります。特定の請求書が生成された場合、生成時間は15秒以上です。セマフォパッケージコンポーネントを呼び出して実行します。メール送信機能を呼び出してメールを送信すると、現在のブラウザの下にこのシミュレートされた請求書が直接ダウンロードされます。

コード

package com.zcw.demo2;

import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @ClassName : RepastService
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-14 16:24
 */
public class RepastService {

    volatile private Semaphore setSemaphore = new Semaphore(10);//大于15秒的账单
    volatile private Semaphore getSetSemaphore = new Semaphore(20);//邮件组件
    volatile private ReentrantLock lock = new ReentrantLock();
    volatile private Condition setCondition = lock.newCondition();
    volatile private Condition getSetCondition = lock.newCondition();
    //producePosition变量含有是最多只有4个信道进行存储用户邮件地址
    volatile private Object[] producePosition = new Object[4];

    private boolean isEmpty() {
        boolean isEmpty = true;
        for (int i = 0; i < producePosition.length; i++) {
            if (producePosition[i] != null) {
                isEmpty = false;
                break;
            }
        }
        if (isEmpty == true) {
            return true;
        } else {
            return false;
        }
    }

    private boolean isFull() {
        boolean isFull = true;
        for (int i = 0; i < producePosition.length; i++) {
            if (producePosition[i] == null) {
                isFull = false;
                break;
            }
        }
        return isFull;
    }

    public void set() {
        try {
            //允许同时最多有10个邮箱账号进行发送
            setSemaphore.acquire();
            lock.lock();
            while (isFull()) {
                setCondition.await();
            }
            for (int i = 0; i < producePosition.length; i++) {
                if (producePosition[i] == null) {
                    producePosition[i] = "账单";
                    System.out.print(Thread.currentThread().getName() + "生成了" + producePosition[i]);
                    break;
                }
            }
            getSetCondition.signalAll();
            lock.unlock();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            setSemaphore.release();
        }
    }

    public void get() {
        try {
            getSetSemaphore.acquire();//允许同时最多有16个邮件发送
            lock.lock();
            while (isEmpty()) {
                //消费者等待
                getSetCondition.await();
            }
            for (int i = 0; i < producePosition.length; i++) {
                if (producePosition[i] != null) {
                    System.out.println(Thread.currentThread().getName() + "发送了" + producePosition[i]);
                producePosition[i]=null;
                break;
                }
            }
            setCondition.signalAll();
            lock.unlock();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            getSetSemaphore.release();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        RepastService repastService = new RepastService();
        ThreadP[] arrayP = new ThreadP[60];
        ThreadC[] arrayC = new ThreadC[60];
        for(int i =0;i<60;i++){
            arrayP[i] = new ThreadP(repastService);
            arrayC[i] = new ThreadC(repastService);
        }
        Thread.sleep(2000);
        for(int i=0;i<60;i++){
            arrayP[i].start();
            arrayC[i].start();
        }
    }
}

package com.zcw.demo2;

/**
 * @ClassName : ThreadC
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-14 16:57
 */
public class ThreadC extends Thread {
    private RepastService repastService;
    public ThreadC(RepastService repastService){
        super();
        this.repastService = repastService;
    }
    @Override
    public void run(){
        repastService.get();
    }
}

package com.zcw.demo2;

/**
 * @ClassName : ThreadP
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-04-14 16:55
 */
public class ThreadP extends Thread {
    private RepastService service;
    public ThreadP(RepastService repastService){
        super();
        this.service = repastService;
    }
    @Override
    public void run(){
        service.set();
    }
}

演算結果:
ここに画像の説明を挿入

475のオリジナル記事を公開 16のような 30,000以上の訪問

おすすめ

転載: blog.csdn.net/qq_32370913/article/details/105576965