`

生产者消费者 Lock Condition实现

阅读更多

    网上有很多生产者消费者模型,很多都是基于synchronized, wait, notify的,也有基于Lock的,下面是我用Lock, Condition实现的.

 

1 仓库:

 

class GodOwn {
    //声明锁对象
    private Lock lock = new ReentrantLock();

    //当仓库中的物品数量不够消费的条件
    Condition lessCondition = lock.newCondition();

    //当仓库中的物品数量超过仓库的总量的条件
    Condition moreCondition = lock.newCondition();

    private final int max_size = 50;

    private int baseNum = 0;

    int getMax_size() {
        return max_size;
    }

    int getBaseNum() {
        return baseNum;
    }

    void setBaseNum(int baseNum) {
        this.baseNum = baseNum;
    }

    public void produce (int neednum) {
        lock.lock();
        try {
            while (this.getBaseNum() + neednum > this.getMax_size()) {//超过总量不生产
                try {
                    moreCondition.await();//超过仓库总量时,生产线程等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.setBaseNum(this.getBaseNum() + neednum);
            System.out.println("生产了" + neednum + "个,仓库共有" + this.getBaseNum() + "个!");
            moreCondition.signalAll();//本轮生产完毕,唤醒对象上所有的线程,看是否需要生产还是消费
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();//释放锁,这一步很重要,最好在finally语句块里执行,防止程序异常,锁永远无法释放
        }
    }

    public void reduce(int neednum) {
        lock.lock();
        try {
            while (this.getBaseNum() - neednum < 0) {
                try {
                    lessCondition.await();//仓库总量不够本次消费数量时,消费线程等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.setBaseNum(this.getBaseNum() - neednum);
            System.out.println("消费了" + neednum + "个,仓库共有" + this.getBaseNum() + "个!");
            lessCondition.signalAll();//本轮消费完毕,唤醒对象上所有的线程,看是否需要生产还是消费
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();//释放锁
        }
    }

}

 

 

2 生产者模型

  

class ProduceThread extends Thread {

    private GodOwn godOwn;

    private int neednum;

    ProduceThread(GodOwn godOwn, int neednum) {
        this.godOwn = godOwn;
        this.neednum = neednum;
    }

    public void run() {
        godOwn.produce(neednum);
    }

}

 3 消费者模型

 

 

class ResuseThread extends Thread {
    private GodOwn godOwn;

    private int neednum;

    ResuseThread(GodOwn godOwn, int neednum) {
        this.godOwn = godOwn;
        this.neednum = neednum;
    }

    public void run () {
        this.godOwn.reduce(neednum);
    }
}

 

 

4 测试代码

 

    public static void main(String[] args) {
        GodOwn godOwn = new GodOwn();
        ProduceThread p1 = new ProduceThread(godOwn, 50);
        ProduceThread p2 = new ProduceThread(godOwn, 30);
        ProduceThread p3 = new ProduceThread(godOwn, 20);
        ProduceThread p4 = new ProduceThread(godOwn, 20);
        ProduceThread p5 = new ProduceThread(godOwn, 20);
        ResuseThread r1 = new ResuseThread(godOwn, 20);
        ResuseThread r2 = new ResuseThread(godOwn, 20);
        ResuseThread r3 = new ResuseThread(godOwn, 20);
        p1.start();
        p2.start();
        p3.start();
        p4.start();
        p5.start();
        r1.start();
        r2.start();
        r3.start();
    }

 运行结果:

 

生产了50个,仓库共有50个!
消费了20个,仓库共有30个!
生产了20个,仓库共有50个!
消费了20个,仓库共有30个!
消费了20个,仓库共有10个!
生产了20个,仓库共有30个!
生产了20个,仓库共有50个!

 

以上只是一个简单的例子,为了说明Lock Condition的用处!

分享到:
评论

相关推荐

    生产者-消费者(lock和condition).zip

    在这个场景中,"生产者-消费者(lock和condition).zip"的文件内容可能包含一个使用Java语言实现的示例,它利用了`java.util.concurrent.locks.Lock`接口和`Condition`接口来解决这个问题。 `Lock`接口是Java并发库...

    python实现生产者消费者并发模型

    多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...

    生产者消费者问题c++实现

    这个C++实现的生产者消费者问题展示了线程间通信和同步的基本方法,它是多线程编程中的重要知识点,对于理解和解决复杂并发问题有着重要意义。通过深入学习和实践,我们可以更好地掌握多线程编程,并在实际项目中...

    编程实现生产者消费者或读写者的同步问题

    在多线程环境中,生产者消费者模型和读者写者问题是经典的并发控制问题,它们都涉及到资源共享与同步。本主题将深入探讨如何使用编程来解决这两个问题。 首先,生产者消费者问题是多线程并发控制中的一个经典例子。...

    生产者消费者Java—LOCK机制

    4. **信号量**:除了Lock之外,生产者-消费者问题常常会用到Condition来协调生产者和消费者的动作。Condition可以创建多个等待队列,允许线程按照特定条件进行等待和唤醒。例如,生产者可能需要等待缓冲区有空位,而...

    Lock、Condition实现简单的生产者消费者模式示例

    这个示例展示了如何使用`Lock`和`Condition`来实现生产者消费者模式的基本逻辑。`Lock`接口相比`synchronized`关键字的优势在于它可以更灵活地控制锁的获取和释放,以及条件的等待和唤醒。此外,`Condition`接口可以...

    java多线程实现生产者和消费者

    生产者和消费者线程都需要有自己的业务逻辑,这可以通过重写`run()`方法实现。 2. **共享资源**:在生产者-消费者模型中,通常会有一个固定大小的缓冲区作为共享资源。可以使用数组或链表实现,但需要注意的是,当...

    线程实现生产者消费者问题

    以下是简化版的生产者和消费者线程实现: ```cpp void producer(int id) { while (true) { std::unique_lock&lt;std::mutex&gt; lock(mtx); cv.wait(lock, [] { return !empty; }); // 等待缓冲区非空 // 创建数据并...

    C++实现生产与消费者模型

    3. **生产者-消费者模型的实现** - **队列**:生产者和消费者之间通常会用到一个共享的缓冲区,也就是队列,用来存储生产者产生的数据供消费者消费。C++中可以使用`std::queue`容器来实现。 - **生产者**:生产者...

    Java基于Lock的生产者消费者模型示例

    本示例中,我们使用了Lock和Condition来实现生产者消费者模型,避免了使用synchronized关键字的方式,而是使用了Lock和Condition来实现线程同步和通信,提高了程序的性能和可读性。 知识点: * Java中的生产者消费...

    生产者消费者Java—synchronized 机制

    2. **BlockingQueue(阻塞队列)**:在实际的生产者消费者实现中,通常会使用`java.util.concurrent`包下的`BlockingQueue`接口。它提供了一种线程安全的数据结构,可以作为生产者和消费者的交界面。生产者将数据放...

    生产者消费者多线程代码

    在Java或C++等编程语言中,我们可以利用多线程来实现“生产者消费者”模式,这是一个经典的并发问题。这个模式涉及到两个主要角色:生产者(Producer)和消费者(Consumer),它们共享一个有限大小的缓冲区作为临界...

    生产者消费者同步问题

    生产者消费者问题是多线程编程中的一个经典案例,主要探讨如何在并发...这个简单的C++实现展示了生产者消费者问题的基本解决方案,但在实际应用中,可能需要考虑更复杂的情况,如线程优先级、超时机制以及异常处理等。

    C++ 用多方程解决生产者与消费者的问题

    本篇将深入探讨如何使用C++的STL库以及线程库来实现多方程解决生产者-消费者问题。 首先,理解问题的基本结构至关重要。假设有一个缓冲区,生产者往里面添加产品,消费者从中取出产品。我们需要确保在任何时候,...

    生产者-消费者问题 VC++

    为防止生产者过快填充缓冲区或消费者过快清空缓冲区,我们需要引入同步机制,如互斥量(mutex)和条件变量(condition variable),来控制生产者和消费者的操作顺序。 在VC++中,我们可以使用`std::mutex`来实现...

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`&lt;thread&gt;`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...

    生产者消费者模型的演变

    在Java中,`java.util.concurrent`包提供了多种实现生产者消费者模型的工具,如`BlockingQueue`。 `BlockingQueue`是Java并发编程的一个核心接口,它实现了队列的数据结构,并且具备线程安全的特性。生产者可以将...

    linux c实现生产者 消费者程序

    在计算机系统设计中,...这个简单的模型可以扩展到多个生产者和消费者,通过适当调整信号量和互斥锁的使用,可以实现更复杂的需求。在实际应用中,还需要考虑错误处理和资源释放等问题,以保证程序的健壮性和稳定性。

    生产者-消费者问题的Pthread实现

    生产者-消费者问题是多线程编程中的一个经典同步问题,主要涉及进程间的协作与通信。在操作系统领域,这个问题常被用来演示如何有效地管理和控制资源的使用。本实验使用Pthread库来解决这个问题,Pthread是POSIX线程...

    生产者与消费者问题

    在生产者与消费者问题中,通常使用`synchronized`或者`Lock`配合`Condition`来控制线程的执行顺序和资源访问。 3. **synchronized关键字**:可以用于方法或者代码块,用于实现互斥访问。在生产者与消费者问题中,当...

Global site tag (gtag.js) - Google Analytics