生产者消费者模型

下面简单的例子编写了java线程中的生产者消费者模型,分为两种编写方式,第一种运用synchroized进行线程同步,用wait()和notify(),notifyAll()进行线程通信,第二种运用lock进行线程同步,用Condition类中的await(),signal(),signalAll()进行线程通信。

一、

实体类:

public class BaoZi {
    private int number ;
    private boolean flag ;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

生产者:

public class SetBZ implements Runnable{
    private BaoZi baoZi;
    public SetBZ(BaoZi baoZi) {
        this.baoZi = baoZi;
    }
    @Override
    public void run() {
        while(true) {
            synchronized (baoZi) {
                if (baoZi.getNumber() > 0) {
                    try {
                        baoZi.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    baoZi.setNumber(baoZi.getNumber() + 1);
                    System.out.println("sc" + 1 + "g,sy" + baoZi.getNumber() + "g");
                    baoZi.notify();
                }
            }
        }

    }
}

消费者:

public class GetBZ implements Runnable{
    private BaoZi baoZi;
    public GetBZ(BaoZi baoZi) {
        this.baoZi = baoZi;
    }
    @Override
    public void run() {
        while (true) {
            synchronized (baoZi) {
                if (baoZi.getNumber() > 0) {
                    baoZi.setNumber(baoZi.getNumber() - 1);
                    System.out.println("xf" + 1 + "g,sy" + baoZi.getNumber() + "g");
                    baoZi.notify();
                } else {
                    try {
                        baoZi.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

测试类:

public class Text {
    public static void main(String[] args) {
        BaoZi baoZi = new BaoZi();
        SetBZ setBZ = new SetBZ(baoZi);
        GetBZ getBZ = new GetBZ(baoZi);
        Thread t1 = new Thread(setBZ);
        Thread t2 = new Thread(getBZ);
        t1.start();
        t2.start();
    }
 

二、

实体类:

public class BaoZi {
    private int number ;
    private boolean flag ;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

生产者:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class SetBZ implements Runnable{
    private BaoZi baoZi;
    private Condition notFull;
    private Condition notEmpty;
    private Lock lock;

    public SetBZ(BaoZi baoZi, Condition notFull, Condition notEmpty, Lock lock) {
        this.baoZi = baoZi;
        this.notFull = notFull;
        this.notEmpty = notEmpty;
        this.lock = lock;
    }

    public SetBZ(BaoZi baoZi) {
        this.baoZi = baoZi;
    }
    @Override
    public void run() {
        while(true) {
            lock.lock();
            try {
                if (baoZi.getNumber() > 0) {
                    notEmpty.await();
                } else {
                    baoZi.setNumber(baoZi.getNumber() + 1);
                    System.out.println("sc" + 1 + "g,sy" + baoZi.getNumber() + "g");
                    notFull.signalAll();
                }
                }
                 catch (InterruptedException e) {
                e.printStackTrace();
            }
            finally {
                lock.unlock();
            }
            }
    }
}

消费者:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class GetBZ implements Runnable{
    private BaoZi baoZi;
    private Condition notFull;
    private Condition notEmpty;
    private Lock lock;
    public GetBZ(BaoZi baoZi, Condition notFull, Condition notEmpty, Lock lock) {
        this.baoZi = baoZi;
        this.notFull = notFull;
        this.notEmpty = notEmpty;
        this.lock = lock;
    }

    public GetBZ(BaoZi baoZi) {
        this.baoZi = baoZi;
    }
    @Override
    public void run() {
        while (true) {
            lock.lock();
                if (baoZi.getNumber() > 0) {
                    baoZi.setNumber(baoZi.getNumber() - 1);
                    System.out.println("xf" + 1 + "g,sy" + baoZi.getNumber() + "g");
                    notEmpty.signalAll();
                } else {
                    try {
                       notFull.await();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    finally {
                        lock.unlock();
                    }
                }
        }
    }
}

测试类:

public class Text {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Condition notFull = lock.newCondition();
        Condition notEmpty = lock.newCondition();
        BaoZi baoZi = new BaoZi();
        SetBZ setBZ = new SetBZ(baoZi,notFull,notEmpty,lock);
        GetBZ getBZ = new GetBZ(baoZi,notFull,notEmpty,lock);
        Thread t1 = new Thread(setBZ);
        Thread t2 = new Thread(getBZ);
        t1.start();
        t2.start();
    }
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值